Python - 存储在字典中的列表中的计数和组项

时间:2016-12-31 10:19:40

标签: python list dictionary collections grouping

我已经看过如何计算字典或列表中的项目的示例。我的词典存储了多个列表。每个列表存储多个项目。

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现有库来实现这两个目标?

5 个答案:

答案 0 :(得分:3)

要进入(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:我希望你的实际代码中有一些有意义的变量名。

答案 1 :(得分:2)

有几种方法可以实现这一目标,但是如果您想要处理事情而不必担心import其他模块或安装和导入外部模块,这种方法可以干净利地“开箱即用”。 “

d作为起始词典:

d  = {'text1': ['A', 'C', 'E', 'F'], 
      'text2': ['A'], 
      'text3': ['C', 'D'], 
      'text4': ['A', 'B'], 
      'text5': ['A']}

创建一个名为dict的新letters,以便您的结果生效,并使用d.keys()中的字母填充它,如果它不是,则创建字母键。 t存在,并创建一个包含来自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]

这会为您留下一个名为dict的{​​{1}},其中包含来自letters的计数值和包含该字母的键,如下所示:

d

现在,要打印您的第一个列表,请执行以下操作:

{'E': [1, ['text1']], 'C': [2, ['text3', 'text1']], 'F': [1, ['text1']], 'A': [4, ['text2', 'text4', 'text1', 'text5']], 'B': [1, ['text4']], 'D': [1, ['text3']]}`

打印每个字母以及列表的第一个或“count”索引的内容作为其值,并使用内置的for letter in sorted(letters): print(letter, letters[letter][0]) 函数将事物整理好。

要打印第二个,同样sorted(),请执行相同操作,但使用第二个或“关键字”列表的索引,sorted()使用.joined进入一个字符串:

,

为了方便复制/粘贴,这里的代码完整无损:

for letter in sorted(letters):
    print(letter, ', '.join(letters[letter][1]))

希望这有帮助!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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到达1 0 23 'x' 'x' 'x' 0 0 0 1 1 10.3 54 123.45678 'x' 'x' 'x' ... 只是计算文本的问题。

答案 4 :(得分:0)

完成第一项任务:

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]))

现在让我解释一下:

  • ''。join(values)将列表(例如 ['A','B','C','D'] 转换为 'ABCD'
  • 然后你加入字典中的每个列表到一个字符串(外部''。join()
  • 计数器是内置包集合中的一个类,它只计算可迭代中的元素(在本例中为字符串)并重现它们是(键,值)对的元组(例如('A',4)
  • 最后,我按字母顺序对计数器项(它就像字典)进行排序( key = lambda l:l [0] 其中 l [0] 是来自(键,值)对的字母。

正如我所看到的,你已经有了第二个问题的解决方案。