【问题标题】:How to convert a list to dict with duplicate keys?如何将列表转换为具有重复键的字典?
【发布时间】:2022-01-19 16:34:33
【问题描述】:

我是python编程的大一新生。现在我有一个列表“lst”,例如:lst = [(1,'a'), (2,'b'), (2,'c'), (3,'d')],我想从 lst 获取一个字典“d”。 “d”应该是{1: ['a'], 2:['b','c'], 3:['d']}

d = defaultdict(list)

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

如何使用理解来实现这一点?

【问题讨论】:

  • 你的方法在我看来很不错
  • 理解只是为了方便。您不必在理解中编写所有内容,它只提供简单的 for 循环。您的代码可读且简洁。
  • 我同意其他cmets;你的代码很好。如果你想把它放在一行上,只需 for k,v in lst: d[k].append(v)

标签: python list dictionary


【解决方案1】:

您的解决方案非常好。列表/字典理解并不总是最好的方法。但如果你坚持,你可以这样做:

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 尚未按 dict 键排序,请将其替换为 sorted(lst, key=lambda x: x[0])
【解决方案2】:

你所拥有的已经很高效了,而且时间也不长。它可以以牺牲易读性为代价转换为单行代码,而性能优势很小或没有:

像这样:

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)

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多