2017-07-10 8 views
-1

ich eine Liste von (unique) Worte:Keeping Anzahl der Treffer in einem Wörterbuch

words = [store, worry, periodic, bucket, keen, vanish, bear, transport, pull, tame, rings, classy, humorous, tacit, healthy] 

, dass ich mit zwei verschiedenen Listen von Listen Gegenprobe wollen (mit dem gleichen Bereich), während das Zählen der Anzahl von Treffer.

l1 = [[terrible, worry, not], [healthy], [fish, case, bag]] 
l2 = [[vanish, healthy, dog], [plant], [waves, healthy, bucket]] 

Ich dachte an ein Wörterbuch verwenden und das Wort als Schlüssel übernehmen, würde aber zwei ‚Werte‘ müssen (eine für jede Liste) für die Anzahl der Treffer.

{"store": [0, 0]} 
{"worry": [1, 0]} 
... 
{"healthy": [1, 2]} 

Wie wäre so etwas wie dieses Werk: So würde die Ausgabe so etwas wie? Vielen Dank im Voraus!

+0

Klingt wie Sie die Grundstruktur ausgearbeitet haben. Mit was genau hast du Probleme? – glibdud

+3

Machen Sie Ihr Leben einfacher und verwenden Sie stattdessen eine Liste von 'collections.Counter'? –

+1

@glibdud, ich denke, ich habe die Idee richtig, aber ich könnte eine Art von Methode oder Workaround fehlen, die einfacher als Iterieren und Hinzufügen wäre ... wie was Tobias sagte gerade jetzt ... gehen, um das auch zu überprüfen! – DJM

Antwort

2

können Sie itertools verwenden, um die Liste zu glätten und dann Wörterbuch Verständnis verwenden:

from itertools import chain 
words = [store, worry, periodic, bucket, keen, vanish, bear, transport, pull, tame, rings, classy, humorous, tacit, healthy] 

l1 = [[terrible, worry, not], [healthy], [fish, case, bag]] 
l2 = [[vanish, healthy, dog], [plant], [waves, healthy, bucket]] 

l1 = list(chain(*l1)) 

l2 = list(chain(*l2)) 

final_count = {i:[l1.count(i), l2.count(i)] for i in words} 
+0

Danke Ajax, funktioniert auch perfekt. Kurz und elegant. Diese Kette wird auch sehr nützlich sein, um einige meiner früheren Code zu vereinfachen! – DJM

+0

Ich bin froh, dass ich helfen konnte! – Ajax1234

2

Für Ihr Wörterbuch Beispiel müßten Sie nur über jede Liste zu durchlaufen und als so diejenigen zum Wörterbuch hinzufügen:

my_dict = {} 
for word in l1: 
    if word in words: #This makes sure you only work with words that are in your list of unique words 
     if word not in my_dict: 
      my_dict[word] = [0,0] 
     my_dict[word][0] += 1 
for word in l2: 
    if word in words: 
     if word not in my_dict: 
      my_dict[word] = [0,0] 
     my_dict[word][1] += 1 

(Oder Sie könnten, dass die wiederholten Code eine Funktion machen, dass die für den Parameter übergibt list, wörterbuch und index, so wiederholen sie weniger zeilen)

Wenn Ihre Listen wie in Ihrem Beispiel 2d sind, dann ändern Sie einfach die erste Iteration in der for-Schleife zu 2d.

my_dict = {} 
for group in l1: 
    for word in group: 
     if word in words: 
      if word not in my_dict: 
       my_dict[word] = [0,0] 
      my_dict[word][0] += 1 
for group in l2 
    for word in group: 
     if word in words: 
      if word not in my_dict: 
       my_dict[word] = [0,0] 
      my_dict[word][1] += 1 

Obwohl, wenn Sie nur wollen, um die Worte gemeinsam wissen, vielleicht könnte Sätze als auch eine Option sein, da Sie die Vereinigung Operatoren in Sets für die einfache Anzeige aller Wörter gemeinsam haben, sondern setzt Duplikate beseitigen Wenn also die Zählungen notwendig sind, ist das Set keine Option.

+0

Danke Davy, ich glaube, ich konnte mir einfach keine Liste als Wert vorstellen, aber es funktioniert perfekt. Sätze sind keine Option wie du gesagt hast, da ich die Anzahl der Treffer benötige! – DJM

+1

Absolut. @ Ajax1234 's iwertools Beispiel ist effizienter, aber Sie können dieses Wörterbuch als ein Werkzeug in Ihrer hinteren Tasche zählen, wenn Sie eine Situation finden, in der Sie nicht' Kette 'verwenden können. Viel Glück! –

Verwandte Themen