2016-12-31 5 views
1

Ich habe Beispiele zum Zählen von Elementen im Wörterbuch oder in der Liste gesehen. Mein Wörterbuch hat mehrere Listen gespeichert. Jede Liste speichert mehrere Elemente.Python - zählen und gruppieren Elemente in der Liste im Wörterbuch

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

1. Ich möchte Frequenz jedes Alphabet zählen, dh die Ergebnisse

A - 4 
B - 1 
C - 2 
D - 1 
E - 1 
F - 1 

2. Ich habe Gruppe von jedem Alphabet wollen sein sollte, dh die Ergebnisse sein sollte

A - text1, text2, text4, text5 
B - text4 
C - text1, text3 
D - text3 
E - text1 
F - text1 

Wie kann ich beides erreichen, indem Sie einige vorhandene Python-Bibliotheken verwenden, ohne viele für loo zu verwenden PS?

+0

Werden die Listen jemals Duplikate enthalten? – 101

+0

Wo hast du versagt? Bitte posten Sie Ihren Code, was Sie bisher versucht haben. – Eddie

+0

Ich habe noch keine anderen Codes. Ich kann Schleifen schreiben, um die Antworten zu finden, aber ich wette, dass es einige Bibliotheken (Sammlungen?) Geben muss, um das zu tun. – user3390906

Antwort

2

Um zu (2) zu gelangen, müssten Sie zunächst die Schlüssel und Werte eines Wörterbuchs invertieren und in einer Liste speichern. Sobald Sie dort sind, verwenden Sie groupby mit einem Schlüssel, um zu der Struktur von (2) zu gelangen.

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: Ich hoffe, Sie würden aussagekräftige Variablennamen in Ihrem echten Code.

+0

Können Sie die Res-Linie erklären? Wie werden groupby und lambda zusammen verwendet? – user3390906

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) 

aus:

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

beachten Sie, dass, wenn Sie A - text1, text2, text4, text5 müssen A - 4 bekommen, ist nur eine Frage, die Texte zu zählen.

0

Für Ihre erste Aufgabe:

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

Nun lassen Sie mich das erklären:

  • '' .join (Werte) schaltet die Liste (zB [ 'A', ‚B ‘, 'C', 'D'] in 'ABCD')
  • Dann Sie jede Liste aus den dicti beitreten onary in eine Zeichenfolge (die äußere ‚‘ .join())
  • Zähler eine Klasse aus der eingebauten Paket ist Sammlungen, die einfach die Elemente in der iterable Zählungen (Zeichenfolge in diesem Fall) und reproduziert sie als Tupel von (Schlüssel, Wert) Paare (z ('A', 4))
  • Schließlich sortiere ich die Zähler Artikel (es ist wie ein Wörterbuch) alphabetisch (key = Lambda l: l [0] wo l [0] ist das Schreiben des (Schlüssel, Wert) Paar.

Als ich sah, haben Sie bereits die Lösung für Ihr zweites Problem.

1

Es gibt ein paar Möglichkeiten, dies zu erreichen, aber wenn Sie die Dinge ohne Sorgen über zusätzliche Module oder das Installieren und Importieren von externen Modulen handhaben möchten, funktioniert diese Methode "out-of-the-box".

Mit d als Start Wörterbuch:

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

ein neues dict, erstellen letters genannt, für Ihre Ergebnisse in leben, und füllen Sie es mit Ihren Briefen, von d.keys() genommen, durch die Buchstabentaste gedrückt zu schaffen, wenn Es ist nicht vorhanden und erstellt eine Liste mit der Anzahl und dem Schlüssel von d als Wert. Wenn es bereits vorhanden ist, erhöhen Sie die Anzahl und fügen Sie den aktuellen Schlüssel von d an seine Schlüsselliste d im Wert an.

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] 

Dies lässt Sie mit einem dict genannt letters enthält Werte der Zählungen und den Schlüssel aus d, die den Buchstaben enthalten, wie folgt aus:

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

nun Ihre erste Liste zu drucken, zu tun:

for letter in sorted(letters): 
    print(letter, letters[letter][0]) 

jeden Buchstaben drucken und den Inhalt des ersten oder ‚count‘ Index der Liste als Wert und die Verwendung die eingebaute sorted() Funktion, um Dinge in Ordnung zu bringen.

die zweite zu drucken, ebenfalls sorted(), das gleiche tun, sondern mit dem zweiten oder ‚Schlüssel‘, Index der Liste in seinem Wert, .joined eine , in einen String mit:

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

zu Kopieren/Einfügen, hier ist der Code von meinem Geschwafel ungebrochen:

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

Hoffe, das hilft!

Verwandte Themen