首页 > 解决方案 > 在列表列表中查找最常见的元素

问题描述

我有一堆键和值

Key 1  ['apple', 'banana', 'orange', 'chicken']
key 1  ['cake', 'orange', 'apple']
key 2  ['oreo','chips']

现在我想按键分组,并且只有 50% 的键中存在的值,所以输出将是

key 1  ['orange', 'apple']
Key 2  ['oreo','chips']

我对应该用来存储它的数据结构感到困惑。我是否应该只使用列表列表来存储值,然后每次搜索所有值并获得顶部。有没有更优化的方法

标签: pythonlistgroup-by

解决方案


您可以简单地拥有一个包含键和列表的对列表。它可以像这样工作:

from itertools import groupby, chain
from collections import Counter

def frequency_filter(group, freq):
    group = list(group)
    c = Counter(chain.from_iterable(set(items) for _, items in group))
    n = round(len(group) * freq)
    return [k for k, v in c.items() if v > n]

data = [('key 1', ['apple', 'banana', 'orange', 'chicken']),
        ('key 1', ['cake', 'orange', 'apple']),
        ('key 2', ['oreo','chips'])]
result = {k: frequency_filter(g, 0.5) for k, g in groupby(data, key=lambda t: t[0])}
print(result)
# {'key 1': ['orange', 'apple'], 'key 2': ['oreo', 'chips']}

推荐阅读