使用Python dict理解来通过首字母对单词列表进行索引

时间:2016-08-04 23:47:58

标签: python

从概念上讲,这很容易,但我似乎无法弄明白。

我想将一个字符串列表转换为一个字典,每个键都是与之关联的单词列表的第一个字母。

# My list of sounds
sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore']

# My dict comprehension which isn't working
indexed = {s[0]: [s] for s in sounds}

我的输出如下:

{'h': ['heck'], 's': ['sniff'], 'b': ['bore']}

我在这里缺少一个追加函数,但每次我尝试实现它都无法给我正确的输出,或者它抛出一个SyntaxError。我错过了什么?

4 个答案:

答案 0 :(得分:4)

这可以通过标准库一次性完成

>>> sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore']
>>> result=dict()
>>> for s in sounds:
        result.setdefault(s[0],[]).append(s)

>>> result
{'b': ['bark', 'bork', 'blork', 'borf', 'bjork', 'boo', 'bre', 'bore'], 's': ['sniff'], 'h': ['heck']}
>>> 

使用itertools的解决方案很好,但它需要额外的步骤对列表进行排序,使其成为O(n log n),而这只需要一次运行,所以是O(n)

collections模块商品defaultdict,其内置setdeafult

>>> from collections import defaultdict
>>> result=defaultdict(list)
>>> for s in sounds:
        result[s[0]].append(s)

>>> result
defaultdict(<class 'list'>, {'b': ['bark', 'bork', 'blork', 'borf', 'bjork', 'boo', 'bre', 'bore'], 's': ['sniff'], 'h': ['heck']})
>>> 

答案 1 :(得分:3)

没问题,itertools to the rescue。您可以按照第一个字母对元素进行分组,然后从中创建一个字典。

sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore']
import itertools

grouped = itertools.groupby(sorted(sounds), key=lambda x: x[0])
d = {k: list(v) for k,v in grouped}
print(d)

答案 2 :(得分:0)

这是你想要实现的目标吗?

firsts = {s[0] for s in sounds}
indexed = {first: [s for s in sounds if s[0]==first] for first in firsts}

答案 3 :(得分:0)

这对于词典理解不是很好用 - 你最终会得到比你需要的更多的循环。如果你直接写它,那么你只扫描输入列表一次:

dict1 = {}
for s in ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore']:
  if not s[0] in dict1.keys():
    dict1[ s[0] ] = []
  dict1[ s[0] ].append(s)     
print dict1