2016-03-26 7 views
1

Wie kann ich ein Python-Wörterbuch mit Schlüsseln initialisieren, die nicht im Voraus festgelegt sind?Python-Wörterbuch mit neuen Schlüsseln initialisieren

Wenn ich gerade das Wörterbuch mit dict = {} initialisiere, gibt es mir einen Schlüsselfehler, wenn ich versuche, es mit neuen Schlüssel-Wert-Paaren zu füllen.

Eine Problemumgehung wäre, einen try-except zu versuchen, so dass zuerst versucht wird, auf vorhandene Schlüssel zuzugreifen, oder das Wörterbuch für einen neuen Schlüssel initialisiert wird, wenn der erste fehlschlägt. Ein konkretes Beispiel wäre Wörter in einem Text werden gezählt (das Codebeispiel zu einer Key Error führen würde):

wordcount = {} 
for word in text: 
    wordcount[word] += 1 
+0

Sie entweder defaultdict verwenden können (int) Ihr Wörterbuch oder verwenden wordcount [Wort] = wordcount.get (Wort, 0) + 1. –

+0

beginnen mit dem, was 'zu erstellen Wortzahl [Wort] + = 1 'ohne die Kurzschrift – woozyking

+0

Wenn Sie nicht wollen, dass andere Benutzer Ihre Frage abstimmen, helfen Sie ihnen, Ihr Problem zu verstehen. Ihre Frage sollte die Verwendung der Python-Sprache sein, also bitte hinter Ihrem Python-Code. Es ist einfacher zu sagen, was falsch ist, wenn man nur auf Code schaut und dann versucht zu verstehen, was die Absicht des Autors ist. – IOR88

Antwort

0

Sie müssen die Schlüssel zu initialisieren, um sicherzustellen, bevor Sie versuchen, sie (+=1) zu erhöhen. Versuchen Sie dies:

wordcount = {} 
text = ["word","foo","word","word","bar","bar","word","something"] 
for word in text: 
    if word in wordcount: # tests to see if the key exists already 
     wordcount[word] += 1 
    else: # initializes the key to 1 
     wordcount[word] = 1 
print(wordcount) 
# prints {'bar': 2, 'word': 4, 'something': 1, 'foo': 1} 
0

Sie müssen zunächst Schlüssel-Wert-Paar zu Ihrem Diktat hinzufügen.

wordcount = {} 
for word in text: 
    if word not in wordcount: 
     wordcount[word] = 0 
    wordcount[word] += 1 
+0

In Zeile 4 sollten Sie 'wordcount [word]' auf '0' anstelle von' 1' setzen. – AMACB

+0

@AMACB Sie haben Recht, oder 'weiter' :) –

2

Mit dem Ansatz, die Sie tun, wie Sie sollte dies sehen tun wird überprüft, ob der Schlüssel bereits vorhanden ist, indem das in Schlüsselwort. Wenn es dann Schritt macht, ansonsten zuweisen nur 1 wie folgt aus:

wordcount = {} 
text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
for word in text: 
    if word in wordcount:  
     wordcount[word] += 1 
    else: 
     wordcount[word] = 1 

print(wordcount) 

# {'yes': 1, 'stuff': 1, 'sentence': 1, 'my': 2, 'is': 2, 'this': 1, 'it': 1} 

Per Ihre Kommentare, können Sie diesen Zustand vermeiden, wenn Sie tatsächlich defaultdict vom collections Modul verwenden (documentation). Sie legen einfach fest, was der Wert default für Ihre Wörterbucheinträge ist und fahren mit Ihrer += fort. Beispiel:

from collections import defaultdict 
my_dict = defaultdict(int) 
text_list = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 

for text in text_list: 
    my_dict[text] += 1 

print(my_dict) 

# defaultdict(<class 'int'>, {'sentence': 1, 'this': 1, 'is': 2, 'my': 2, 'yes': 1, 'it': 1, 'stuff': 1}) 

Nun, wenn Sie versuchen einfach, Wörter in Text zu zählen, dann gibt es etwas eingebaute in diese bereits für Sie tun Counter vom collections Modul (documentation) genannt. Dies wird alle ähnlichen Elemente zählen. Beachten Sie das Beispiel:

Achten Sie auf den Ausgang, wie es in der Reihenfolge der häufigsten ist. Wenn Sie das häufigste Wort bekommen benötigen, rufen Sie most_common darauf:

print(my_count_dict.most_common(1)) 
# [('my', 2)] 
+0

@Alpha überprüfen Sie das Update. Ich habe das defaultdict-Beispiel hinzugefügt – idjaw

+0

Ein Problem mit Counter (was übrigens funktioniert, danke!) Ist, dass ich am Ende sortieren möchte und es scheint, dass Wörterbücher besser zum Sortieren geeignet sind ... – Alpha

+0

Wörterbücher sind nicht geordnet. Wenn Sie jedoch durch die Dokumentation schauen, und beobachten Sie von meiner Ausgabe, die Sammlungen Counter, dass es durch die häufigsten Buchstaben "bestellt" wird. Wenn Sie den häufigsten Buchstaben benötigen, rufen Sie '.most_common (1)'. Ich zeige ein Beispiel – idjaw

2

Keine Notwendigkeit, Ihre dict mit vordefinierten Werten zu initialisieren.

Sie brauchen auch keine try/except, aber Python nur defaultdict die Verwendung mit dem Standardtyp auf int:

from collections import defaultdict 
wordcount = defaultdict(int) 
for word in text: 
    wordcount[word] += 1 

Wenn Sie jedoch nur die Wörter in einer Liste zählen müssen, Python hatte auch eine Hilfsklasse namens Counter, in Sammlungen.

0

Wenn ich Ihr Ziel hier verstanden habe, die eine dict des Wortes zu erhalten ist: Mapping zählen, dann könnte man es auch tun, mit Wörterbuch Verständnis (unter Beispiel idjaw):

>>> text = ["this", "is", "my", "sentence", "yes", "it", "is", "my", "stuff"] 
>>> 
>>> {c:text.count(c) for c in text} 
{'it': 1, 'my': 2, 'yes': 1, 'is': 2, 'stuff': 1, 'this': 1, 'sentence': 1} 

Oder auch Counter von collections Modul tun würde, auch den Job:

>>> from collections import Counter 
>>> 
>>> c = Counter() 
>>> 
>>> for word in text: 
     c[word] += 1 


>>> c 
Counter({'my': 2, 'is': 2, 'it': 1, 'yes': 1, 'stuff': 1, 'this': 1, 'sentence': 1}) 
>>> 
+0

Für diesen Fall würde es so aussehen, als würde die Zählung so in das Verständnis gestellt werden, dass es "O (n^2)' – idjaw

+0

@idjaw ... korrekt ist ... Deshalb habe ich auch die 'Counter' Lösung hinzugefügt ... Danke für den Kopf –

Verwandte Themen