2016-06-13 4 views
2

Ich habe ein Standardwörterbuch. Ich durchlaufe viele Zeichenfolgen und füge sie dem Verzeichnis unter dem Schlüssel als Zahl hinzu, aber nur dann, wenn dieser Wert noch nicht im Wörterbuch vorhanden ist. So sieht mein Code wie folgt aus:Fügen Sie einen Wert hinzu, wenn dieser Wert im Wörterbuch nicht vorhanden ist

from collections import defaultdict 
strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in my_dict.itervalues(): 
     my_dict[key].append(string) 
     key += 1 

print my_dict 

aber es scheint nicht zu funktionieren, weil alle Strings dem Wörterbuch hinzugefügt werden, wie folgt aus:

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val2'], 3: ['val3']})

‚val2‘ sollte nicht hinzugefügt werden und es sollte wie folgt aussieht:

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']})

Was mache ich falsch?

+3

Ich schlage vor, herum mit einfachem zu spielen r Beispiele. Versuchen Sie, die Ergebnisse dieser Ausdrücke zu erraten: '1 in [1]' und '1 in [[1]]' und '[1] in [[1]]'. Wenn Sie ein Muster identifizieren können, können Sie dieses Wissen auf Ihr tatsächliches Problem anwenden. – Kevin

+0

Ich bin mir nicht sicher, was Sie am Ende erreichen wollen und warum Sie defaultdict dafür verwenden. Wie wäre es mit 'dedup = set (strings)' zu entfernen dupliziert dann 'dict (zip (range (len (dedup)), deduplizieren))' um die Liste zu einem Wörterbuch zu machen? – raphv

+0

Danke @Kevin, jetzt sehe ich, wie es funktioniert – GohanP

Antwort

2

Beachten Sie, dass my_dict.itervalues() eine Liste von Listen in Ihrem Fall zurückgibt. So string not in lists gibt immer True, wie Sie aus dem folgenden Code sehen können,

>>> "val2" not in [["val1"], ["val2"]] 
True 

Um das gewünschte Ergebnis, flache eine Liste von Listen in eine Liste zu bekommen mit itertools.chain.from_iterable,

>>> import itertools 
>>> "val2" not in itertools.chain.from_iterable([["val1"], ["val2"]]) 
False 

Die vollständiger Quellcode für Ihren Fall,

from collections import defaultdict 
import itertools 

strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in itertools.chain.from_iterable(my_dict.values()): # flat a list of lists into a list 
     my_dict[key].append(string) 
     key += 1 

print(my_dict) 
# Output 
defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']}) 
Verwandte Themen