Python 字典和列出单词在列表中的位置

Python 字典和列出单词在列表中的位置,python,dictionary,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

我需要一个列表,并使用字典对列表中出现的特定项目进行编目,例如:

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
然后我得到一个特定单词的键错误,我不明白为什么我应该得到一个错误

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

至少,您应该删除引号:

if D.has_key(word_list[i]) == False:
但您也误用了许多Python结构:

为什么要对指数进行汇总? 你为什么要和False作比较? 您不应该使用setdefault吗 像这样:

for i in range(len(word_list)):
   D.setdefault(word_list[i], []).append(i)

我认为这将是解决您问题的最短解决方案:

>>> 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中还有一个setdefault方法,可用于:

>>> 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。

我对您的解决方案进行了一些修改,使其能够正常工作

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]}

如果单词_list[i]不在D.中,则拼写它。我最初有这个词,但从我所能看出,它将每次出现的索引加在一起,而不是列出它们。我编程失败。@geogeburrows-你想让它做什么?我发布的代码会将x处的值设置为出现x的所有索引的列表。我使用的是False,所以如果列表中的某个项不在字典中,那么它会被添加吗?另外,我还没有学过设置默认值之类的东西,所以我不知道如何使用它们。。。。事实上,当你在if-else的情况下把肯定从句放在第一位而不是沉迷于其中时,这通常被认为是好的形式。至于被教过什么,请阅读阿西莫夫的。你的代码会起作用,尽管它包含了一些注释:1你不需要预先填充你的口述——你的代码会在单词出现时为它们创建新的键;2您应该在for中使用enumerate来获取每个单词的内容及其索引号,就像i,enumerateword_列表中的单词一样;3您不应该在Python代码中使用dict作为变量名,因为它是字典类名称-这将成为shadowedAha谢谢!然而,我唯一的问题是:如果您添加新条目,而该条目在字典中不存在,那么:dict={'a':[],'b':[],'c':[],'e':[]是否多余?我之所以问这个问题,是因为我可能需要修改这个代码来列出单词在书中的位置,而我无法列出这么多单词集合中出现的每个单词。再说一次,我对Python知之甚少,但它似乎在省略dict行的情况下工作。再次感谢!我没有看到jsbueno的评论出现,该死。@jsbueno我预先填充字典很简单,因为他这么做了,我知道没有理由这么做。我不知道2和3,从来没有真正使用过Python,我以后会记住它们。炫耀:D=dictk,mapperator.itemgeter1,v代表k,v在itertools中。groupbysortedx[:-1]代表Enumerate中的x,operator.itemgeter0
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}