我有一堆键和值
Key 1 ['apple', 'banana', 'orange', 'chicken']
key 1 ['cake', 'orange', 'apple']
key 2 ['oreo','chips']
现在我要按键分组,并且只具有50%的键中存在的值,这样输出就可以了
key 1 ['orange', 'apple']
Key 2 ['oreo','chips']
我对我应该用来存储它的数据结构感到困惑。我是否应该仅使用列表列表来存储值,然后每次都搜索所有值并获得顶部。有没有更优化的方法
答案 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)