我是一名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)
我该如何使用推导式来实现这个?
我是一名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)
我该如何使用推导式来实现这个?
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])
lst
没有按照字典键排序,请使用sorted(lst, key=lambda x: x[0])
替换它。 - chepner你已经拥有了相当高效且不算太长的代码。它可以转换为一行代码,但可读性会降低,而且几乎没有性能上的好处:
像这样:
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)
for k,v in lst: d[k].append(v)
。 - It_is_Chris