字典中的字典和列表位置

时间:2011-12-12 18:23:26

标签: python dictionary

我需要获取一个列表并使用字典来编目列表中特定项目的位置,例如:

  

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,我不明白为什么我会收到错误。

3 个答案:

答案 0 :(得分:6)

if D.has_key('word_list[i]') == False:
呃,什么?

至少,你应该删除引号:

if D.has_key(word_list[i]) == False:

但是你也滥用了许多Python结构:

  1. 为什么总结指数?
  2. 你为什么要与False比较?
  3. 您不应该使用setdefault
  4. 像这样:

    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