2016-06-13 26 views
2

我有一個默認字典。我循環了許多字符串,並將它們添加到鍵下的目錄中作爲數字,但前提是字典中沒有該值。所以,我的代碼如下所示:如果該值在字典中不存在,則添加一個值

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 

,但它似乎沒有工作,因爲所有的字符串被添加到字典中,像這樣:

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

「VAL2」不應該被添加它應該是這樣的:

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

我在做什麼錯?

+3

我建議玩簡單r例子。嘗試猜測這些表達式的結果:[1]中的1和[[1]]中的1以及[[1]]中的[1]。如果你能識別一個模式,你可以將這些知識應用於你的實際問題。 – Kevin

+0

我不確定你最終想達到的目標,以及爲什麼你要使用defaultdict。如何使用'dedup = set(strings)'去除重複然後'dict(zip(範圍(len(dedup)),dedup))'使列表成爲字典? – raphv

+0

謝謝@Kevin,現在我看它是如何工作的 – GohanP

回答

2

請注意,my_dict.itervalues()會返回您的案例中的列表清單。所以string not in lists總是返回True,你可以從下面的代碼中看到,

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

要獲得期望的結果,列出的扁平列表到使用itertools.chain.from_iterable列表,

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

的爲您的情況的完整源代碼,

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']}) 
相關問題