2016-08-04 74 views
1

从概念上讲,这很容易,但我似乎无法弄清楚。使用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 。我错过了什么?

+0

2个不同的值不能具有相同的密钥。因此,每次出现新的“b ...”或“h ...”或“s ...”时,您都要继续写下以前的值,因为它们给出相同的键“b”,“h”和“的”。你应该阅读关于词典... – Julien

+2

不要理解这个东西 –

+2

这种分组任务不适合理解。正常的循环效果更好。 – user2357112

回答

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日志N),而该做同样的,在短短一个走得那么是O(n)

collections模块报价defaultdictsetdeafult

01有一个构建
0

这是你想要实现的吗?

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

这是如何使它与理解一起工作,但不幸的是它仍然是O(n^2)在最坏的情况下都有自己的关键。 –

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) 
+0

美丽!我会把它分开。谢谢您的帮助! – Drew

+0

@Drew对itertools有更深入的了解,它可以工作奇迹(它可以在迭代器上工作,所以在某些情况下,可以覆盖无限序列和东西)。 – Carsten

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