Skip to main content
 首页 » 编程设计

Python之对存储在字典中的列表中的项目进行计数和分组

2025年05月04日24mate10pro

我看过有关如何对字典或列表中的项目进行计数的示例。我的字典存储了多个列表。每个列表存储多个项目。

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   

如何在不使用许多 for 循环的情况下使用一些 Python 现有库来实现这两者?

请您参考如下方法:

要到达 (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:我希望您在实际代码中使用有意义的变量名。