从概念上讲,这很容易,但我似乎无法弄明白。
我想将一个字符串列表转换为一个字典,每个键都是与之关联的单词列表的第一个字母。
# 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 :(得分: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