1

我正在浏览单个单词的列表并创建一个字典,其中单词是键,单词的索引是值。

dictionary = {}
for x in wordlist:
    dictionary[x] = wordlist.index(x)

目前这很好用,但我希望在第二次或第三次找到相同单词时添加更多索引等。所以如果短语是“我要去城里”,我会期待创建一个这样的字典:

{'I': 0, 'am' : 1, 'going' : 2, 'to': (3, 5), 'go' : 4, 'town' : 6}

所以我想我需要字典中的列表?然后向它们附加更多索引?任何关于如何实现这一点的建议都会很棒!

4

5 回答 5

7

你可以这样做:

dictionary = {}
for i, x in enumerate(wordlist):
    dictionary.setdefault(x, []).append(i)

解释:

  • 您不需要调用index(). 使用起来更高效、更酷enumerate()
  • dict.setdefault()使用第一个参数作为键。如果未找到,则插入第二个参数,否则忽略它。然后它返回(可能是新插入的)值。
  • list.append()将项目附加到列表中。

你会得到这样的东西:

{'I': [0], 'am' : [1], 'going' : [2], 'to': [3, 5], 'go' : [4], 'town' : [6]}

使用列表而不是元组,并且使用列表,即使它只有一个元素。我真的认为这样更好。

更新

受到@millimoose 对 OP 的评论的无耻启发(谢谢!),这段代码更好更快,因为它没有构建很多[]从未插入字典的代码:

import collections
dictionary = collections.defaultdict(list)
for i, x in enumerate(wordlist):
    dictionary[x].append(i)
于 2013-08-08T23:34:34.967 回答
2
>>> wl = ['I', 'am', 'going', 'to', 'go', 'to', 'town']
>>> {w: [i for i, x in enumerate(wl) if x == w] for w in wl}
{'town': [6], 'I': [0], 'am': [1], 'to': [3, 5], 'going': [2], 'go': [4]}
于 2013-08-08T23:48:28.350 回答
0
import collections
dictionary= collections.defaultdict(list)
for i, x in enumerate( wordlist ) : 
    dictionary[x].append( i )
于 2013-08-08T23:47:59.410 回答
0

对象就是对象,无论它们在哪里。

dictionary[x] = []
 ...
dictionary[x].append(y)
于 2013-08-08T23:34:21.893 回答
0

一个可能的解决方案:

dictionary= {}
for i, x in enumerate(wordlist):
    if not x in dictionary : dictionary[x]= []
    dictionary[x].append( i )
于 2013-08-08T23:34:30.567 回答