如何将带有重复键的列表转换为字典?

3

我是一名Python编程的新手。现在我有一个名为“lst”的列表,如下所示:lst = [(1,'a'), (2,'b'), (2,'c'), (3,'d')],我想从lst中获取一个字典"d",其应该是这样的:{1: ['a'], 2:['b','c'], 3:['d']}

d = defaultdict(list)

for k,v in lst:
    d[k].append(v)

我该如何使用推导式来实现这个?


2
你的方法看起来很整洁。 - nikeros
推导式只是为了方便而存在的。你不必把所有东西都写在推导式里,因为它并没有比普通的for循环提供更多的功能。你的代码既可读性强又简洁明了。 - Ch3steR
我同意其他评论者的观点,你的代码很好。如果你想让它放在一行上,只需这样做:for k,v in lst: d[k].append(v) - It_is_Chris
2个回答

5
你的解决方案非常好。列表/字典推导式并不总是最佳选择。但如果你坚持要使用,可以像下面这样做:
from itertools import groupby

lst = [(1, 'a'), (2, 'b'), (2, 'c'), (3, 'd')]

res = {k: [b for a, b in g] for k, g in groupby(lst, key=lambda x: x[0])}
print(res)

输出:

{1: ['a'], 2: ['b', 'c'], 3: ['d']}

注: 如果传入的列表是有序的,那么这个解决方案将起作用。如果不是,请确保在使用字典推导式之前对列表进行排序(感谢@Chepner)。

sorted_lst = sorted(lst, key=lambda x: x[0])

1
如果lst没有按照字典键排序,请使用sorted(lst, key=lambda x: x[0])替换它。 - chepner

0

你已经拥有了相当高效且不算太长的代码。它可以转换为一行代码,但可读性会降低,而且几乎没有性能上的好处:

像这样:

dic = next(g  for g in [{}] if not any(g.setdefault(k,[]).append(v) for k,v in lst))

或者这样:

dic = {}; dic.update((k,dic.get(k,[])+[v]) for k,v in lst)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接