在列表列表中查找最常见的元素

时间:2019-08-21 16:03:00

标签: python list group-by

我有一堆键和值

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

现在我要按键分组,并且只具有50%的键中存在的值,这样输出就可以了

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

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

3 个答案:

答案 0 :(得分:2)

您可以简单地得到一个包含钥匙和钥匙对的列表。它可以像这样工作:

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']}

答案 1 :(得分:0)

我会编写一些功能/代码以按键对它们进行分组(也许您已经完成了此操作)。

在对它们进行分组时,将值添加到每个匹配的键中。因此key1和key1都将进入key1的键中的字典中。

在对它们进行分组之后,遍历字典中的每个键,并删除50%的时间不存在的所有元素,然后删除其他元素的重复项,以便仅保留50%的时间存在的项。

如果您要使用两个字典,则可以在50%或更多的时间内提取每个键中的值,并将它们存储在与上面相同的方式中,但是将其存储在单独的字典中。

以下是一些字典文档,您可以轻松地添加,删除和更新: W3Schools Python Dictionary Documentation

答案 2 :(得分:0)

一种选择是将值存储为dict,

f <- function(df, var) {
  lev <- levels(df[[var]])
  df[[var]] <- forcats::fct_relevel(df[[var]], lev[1L], after = length(lev) - 1L)

  ggplot(df, aes_string(x = "Sepal.Width", y = "Sepal.Length", fill = var)) +
    geom_bar(stat = "identity")
}

f(iris, "Species")

打印:

lst = [
{'key': 'key 1', 'values': ['apple', 'banana', 'orange', 'chicken']},
{'key': 'key 1', 'values': ['cake', 'orange', 'apple']},
{'key': 'key 2', 'values': ['oreo','chips']},
]

from itertools import groupby

out = []
for v, g in groupby(sorted(lst, key=lambda k: k['key']), lambda k: k['key']):
    l = list(g)
    s = set(v for i in l for v in i['values'])
    c = [(v, sum(v in i['values'] for i in l) / len(l)) for v in s]
    out.append({v: [v for v, cnt in c if cnt > 0.5]})

from pprint import pprint
pprint(out, width=40)