【问题标题】:List of tuples to dictionary with duplicates keys via list comprehension?通过列表理解将元组列表到带有重复键的字典?
【发布时间】:2020-09-30 13:05:53
【问题描述】:

我有一个包含重复项的元组列表,我已经使用我在此处找到的代码将它们转换为字典:

https://stackoverflow.com/a/61201134/2415706

mylist = [(a,1),(a,2),(b,3)]    
result = {}
for i in mylist:  
   result.setdefault(i[0],[]).append(i[1])
print(result)
>>> result = {a:[1,2], b:[3]}

我记得了解到大多数 for 循环都可以重写为推导式,所以我想练习,但在过去的一个小时里我没能完成一项工作。

我读到了这个:https://stackoverflow.com/a/56011919/2415706,现在我找不到另一个库可以做到这一点,但我也不确定我想写的这个理解是否是一个坏主意,因为 append 会改变一些东西。

【问题讨论】:

  • 没有直接的等价物,因为 result 在您使用 dict 理解时不存在。微不足道,你可以做不必要的低效:{k:[y for x,y in mylist if x==k] for k,_ in mylist}
  • 请注意,“我记得学习过大多数 for 循环都可以重写为推导式”这根本不是真的,即使是这样,大多数循环也不应该 被重写为推导式。 Comprehensions 是声明性构造,用于表达对任意迭代的映射/过滤操作以产生一些容器(list、dict、set...)。 For 循环是命令式结构,是 Python 中的基本控制流结构。就用例而言,根本不等同。

标签: python dictionary-comprehension


【解决方案1】:

理解旨在以相互独立的顺序映射项目,并且不适合聚合,例如您的问题中的情况,其中项目附加到的子列表取决于前一个项目的子列表追加到。

如果必须,您可以使用嵌套推导生成所需的输出,但它会将在 O(n) 时间复杂度中通过循环解决的问题变成需要 O(n ^ 2) 改为:

{k: [v for s, v in mylist if s == k] for k, _ in mylist}

【讨论】:

  • 很有教育意义,谢谢。时间复杂度似乎不值得,我会保持原样。
猜你喜欢
  • 2015-04-03
  • 2017-11-28
  • 2021-08-27
  • 2013-05-28
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多