2017-02-10 34 views
1

我在一個愚蠢的問題上工作了一個多小時,但我找不出解決方案。 我使用初始列表創建一個defaultdict(list),並通過for循環更新這些列表。 但是,每次我更新一個值時,所有其他值都會更新爲相同的值。 有人可以幫我嗎? 這裏是我的代碼:Python:defaultdict每個值更新

from collections import defaultdict 
base = ["coucou", "salut", "tchao"] 
initial_vector = [0]*len(base) 
dict_vectorized_documents = defaultdict(lambda: initial_vector) 
inversed_index = {"coucou": [(1, 3), (100, 4)], "salut": [(1, 1), (99, 2), (33, 3)], "tchao": [(1, 5)]} 

for i, word in enumerate(base): 
print(word) 
for element in inversed_index[word]: 
    print(element[0]) 
    print(i) 
    print(element[1]) 
    print(dict_vectorized_documents[element[0]][i]) 
    dict_vectorized_documents[element[0]][i] = element[1] 
    print(dict_vectorized_documents) 

print(dict_vectorized_documents) 

這裏是我的日誌當我運行它:

coucou 
1 
0 
3 
0 
defaultdict(<function <lambda> at 0x7fcc5fac1f28>, {1: [3, 0, 0]}) 
100 
0 
4 
3 
defaultdict(<function <lambda> at 0x7fcc5fac1f28>, {1: [4, 0, 0], 100:  [4, 0, 0]}) 
salut 
1 
1 
1 
0 
defaultdict(<function <lambda> at 0x7fcc5fac1f28>, {1: [4, 1, 0], 100: [4, 1, 0]}) 
99 
1 
2 
1 
defaultdict(<function <lambda> at 0x7fcc5fac1f28>, {1: [4, 2, 0], 99: [4, 2, 0], 100: [4, 2, 0]}) 
33 
1 
3 
2 
defaultdict(<function <lambda> at 0x7fcc5fac1f28>, {1: [4, 3, 0], 99: [4, 3, 0], 100: [4, 3, 0], 33: [4, 3, 0]}) 
tchao 
1 
2 
5 
0 

非常感謝您!

回答

2

因爲您在defaultdict工廠中將返回。 最簡單的解決方案?明確其與list複製:

>>> from collections import defaultdict 
>>> base = ["coucou", "salut", "tchao"] 
>>> initial_vector = [0]*len(base) 
>>> dict_vectorized_documents = defaultdict(lambda: list(initial_vector)) 

這是一個人爲的例子,也許使它更加清晰:

>>> initial_list = [0, 0, 0] 
>>> def get_initial(): 
...  return initial_list 
... 
>>> d = {} 
>>> for k, i in zip(['key1','key2','key3'],range(3)): 
...  new_list = get_initial() 
...  new_list[i] = 'mutated' 
...  d[k] = new_list 
... 
>>> d 
{'key2': ['mutated', 'mutated', 'mutated'], 'key3': ['mutated', 'mutated', 'mutated'], 'key1': ['mutated', 'mutated', 'mutated']} 

所以new_list不是所有後,一個新的列表。但是,如果我們這樣做:

>>> initial_list = [0, 0, 0] 
>>> def get_initial(): 
...  return list(initial_list) 
... 
>>> d = {} 
>>> for k, i in zip(['key1','key2','key3'],range(3)): 
...  new_list = get_initial() 
...  new_list[i] = 'mutated' 
...  d[k] = new_list 
... 
>>> d 
{'key2': [0, 'mutated', 0], 'key3': [0, 0, 'mutated'], 'key1': ['mutated', 0, 0]} 
>>> 
+0

非常感謝您! :d – guillaumegg10

0

你不是應該在defaultdict對象上做追加如:

dict_vectorized_documents[element[0]][i].append(element[1])