[英]Python - count and group items in list stored in dictionary
我已经看到了有关如何计算字典或列表中项目的示例。 我的词典存储了多个列表。 每个列表存储多个项目。
d = dict{}
d = {'text1': ['A', 'C', 'E', 'F'],
'text2': ['A'],
'text3': ['C', 'D'],
'text4': ['A', 'B'],
'text5': ['A']}
1.我想计算每个字母的频率,即结果应为
A - 4
B - 1
C - 2
D - 1
E - 1
F - 1
2.我想按每个字母分组,即结果应为
A - text1, text2, text4, text5
B - text4
C - text1, text3
D - text3
E - text1
F - text1
如何通过使用一些现有的Python库而不使用许多for循环来实现这两者?
要进入(2),您必须首先反转字典的键和值,并将它们存储在列表中。 到达那里后,使用groupby
和一个键来访问(2)的结构。
from itertools import groupby
arr = [(x,t) for t, a in d.items() for x in a]
# [('A', 'text2'), ('C', 'text3'), ('D', 'text3'), ('A', 'text1'), ('C', 'text1'), ('E', 'text1'), ('F', 'text1'), ('A', 'text4'), ('B', 'text4'), ('A', 'text5')]
res = {g: [x[1] for x in items] for g, items in groupby(sorted(arr), key=lambda x: x[0])}
#{'A': ['text1', 'text2', 'text4', 'text5'], 'C': ['text1', 'text3'], 'B': ['text4'], 'E': ['text1'], 'D': ['text3'], 'F': ['text1']}
res2 = {x: len(y) for x, y in res.items()}
#{'A': 4, 'C': 2, 'B': 1, 'E': 1, 'D': 1, 'F': 1}
PS:我希望您在真实代码中使用有意义的变量名。
有几种方法可以完成此操作,但是如果您希望处理这些事情而不必担心import
其他模块或安装和导入外部模块,则此方法将“开箱即用”。
以d
作为起始字典:
d = {'text1': ['A', 'C', 'E', 'F'],
'text2': ['A'],
'text3': ['C', 'D'],
'text4': ['A', 'B'],
'text5': ['A']}
创建一个新的dict
,呼吁letters
,你的结果住,并与你的信,取自填充它d.keys()
创建如果它不存在的字母键,并创建与计数的列表和来自d
的键值。 如果已经存在,则增加计数,并将当前键从d
附加到值的d
键列表中。
letters = {}
for item in d.keys():
for letter in d[item]:
if letter not in letters.keys():
letters[letter] = [1,[item]]
else:
letters[letter][0] += 1
letters[letter][1] += [item]
这样,您便得到了一个包含letters
的dict
letters
其中包含计数值以及d
中包含字母的键,如下所示:
{'E': [1, ['text1']], 'C': [2, ['text3', 'text1']], 'F': [1, ['text1']], 'A': [4, ['text2', 'text4', 'text1', 'text5']], 'B': [1, ['text4']], 'D': [1, ['text3']]}`
现在,要打印您的第一个列表,请执行以下操作:
for letter in sorted(letters):
print(letter, letters[letter][0])
打印每个字母和列表的第一个索引(或“计数”索引)的内容作为其值,并使用内置的sorted()
函数对事物进行排序。
要打印第2,同样sorted()
做同样的,但与第二或“钥匙”,它的价值列表中的指标, .joined
使用,
为一个字符串:
for letter in sorted(letters):
print(letter, ', '.join(letters[letter][1]))
为了简化“复制/粘贴”操作,以下是我杂乱无章的代码:
d = {'text1': ['A', 'C', 'E', 'F'],
'text2': ['A'],
'text3': ['C', 'D'],
'text4': ['A', 'B'],
'text5': ['A']}
letters = {}
for item in d.keys():
for letter in d[item]:
if letter not in letters.keys():
letters[letter] = [1,[item]]
else:
letters[letter][0] += 1
letters[letter][1] += [item]
print(letters)
for letter in letters:
print(letter, letters[letter][0])
print()
for letter in letters:
print(letter, ', '.join(letters[letter][1]))
希望这可以帮助!
from collections import Counter, defaultdict
from itertools import chain
d = {'text1': ['A', 'C', 'E', 'F'],
'text2': ['A'],
'text3': ['C', 'D'],
'text4': ['A', 'B'],
'text5': ['A']}
counter = Counter(chain.from_iterable(d.values()))
group = defaultdict(list)
for k, v in d.items():
for i in v:
group[i].append(k)
出:
Counter({'A': 4, 'B': 1, 'C': 2, 'D': 1, 'E': 1, 'F': 1})
defaultdict(list,
{'A': ['text2', 'text4', 'text1', 'text5'],
'B': ['text4'],
'C': ['text1', 'text3'],
'D': ['text3'],
'E': ['text1'],
'F': ['text1']})
from collections import defaultdict
alphabets = defaultdict(list)
his is a way to acheive this:
for text, letters in d.items():
for letter in letters:
alphabets[letter].append(text)
for letter, texts in sorted(alphabets.items()):
print(letter, texts)
for letter, texts in sorted(alphabets.items()):
print(letter, len(texts))
请注意,如果您拥有A - text1, text2, text4, text5
才能到达A - 4
则只需对文本进行计数即可。
对于您的第一个任务:
from collections import Counter
d = {
'text1': ['A', 'C', 'E', 'F'],
'text2': ['A'],
'text3': ['C', 'D'],
'text4': ['A', 'B'],
'text5': ['A']
}
occurrences = Counter(''.join(''.join(values) for values in d.values()))
print(sorted(occurrences.items(), key=lambda l: l[0]))
现在让我解释一下:
如我所见,您已经有了第二个问题的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.