2017-02-10 78 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])