簡體   English   中英

Python-對字典中存儲的列表中的項目進行計數和分組

[英]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]

這樣,您便得到了一個包含lettersdict 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]))

現在讓我解釋一下:

  • ''.join(values)將列表(例如['A','B','C','D']轉換為'ABCD'
  • 然后,將字典中的每個列表連接到一個字符串中(外部的''.join()
  • Counter是內置程序包集合中的一個類,它僅對可迭代的元素(在這種情況下為字符串)進行計數,並將它們復制為(鍵,值)對的元組(例如('A',4)
  • 最后,我按字母順序對Counter項(就像字典一樣)進行排序( key = lambda l:l [0]其中l [0](鍵,值)對中的字母。

如我所見,您已經有了第二個問題的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM