我需要获取一个列表并使用字典来编目列表中特定项目的位置,例如:
L = ['a','b','c','b','c','a','e']
字典需要包含以下内容:
D = {'a':0,5,'b':1,3,'c':2,4,'e':6}
但是,如果我使用我写的内容:
for i in range(len(word_list)):
if D.has_key('word_list[i]') == False:
D['word_list[i]'] = i
else:
D[word_list[i]] += i
然后我得到某个单词的KeyError,我不明白为什么我会收到错误。
答案 0 :(得分:6)
if D.has_key('word_list[i]') == False:
呃,什么?
至少,你应该删除引号:
if D.has_key(word_list[i]) == False:
但是你也滥用了许多Python结构:
setdefault
像这样:
for i in range(len(word_list)):
D.setdefault(word_list[i], []).append(i)
答案 1 :(得分:4)
我修改了你的解决方案
word_list = ['a', 'b', 'c', 'b', 'c', 'a', 'e']
dict = {'a': [], 'b': [], 'c': [], 'e': []}
for i in range(len(word_list)):
if word_list[i] not in dict:
dict[word_list[i]] = [i]
else:
dict[word_list[i]].append(i)
结果
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}
答案 2 :(得分:2)
我认为这将是您问题的最短解决方案:
>>> from collections import defaultdict
>>> D = defaultdict(list)
>>> for i,el in enumerate(L):
D[el].append(i)
>>> D
defaultdict(<type 'list'>, {'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]})
如果您想坚持dict
,请更正您的代码,我会想出:
>>> D = {}
>>> for i,el in enumerate(L):
if el not in D:
D[el] = [i] #crate a new list
else:
D[el].append(i) #appending to the existing list
>>> D
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}
此外,setdefault
中有一个dict
方法可以使用:
>>> D = {}
>>> for i,el in enumerate(L):
D.setdefault(el,[]).append(i)
>>> D
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}
但我更喜欢使用defaultdict
中的collections
。