【问题标题】:Python34: Using Dictionary Comprehension to Copy Values form one list of dictionaries to anotherPython34:使用字典理解将值从一个字典列表复制到另一个
【发布时间】:2015-04-14 19:40:19
【问题描述】:

我正在编写一个脚本来处理数据,所以我有一个包含计算值字典的列表。一旦我计算出新的,我想在适当的字典中附加新条目。

我知道我可以使用列表或 np 数组来做到这一点,但我想学习如何使用字典。我也刚开始使用列表推导,所以我想更好地了解如何正确使用它。所以让自己的生活变得艰难。

这里是简化的例子。

我计算值并将它们放入字典中,然后将字典放入一个列表中以对应每个条目。

A=[{'low':1},{'low':2}]
print(A)
[{'low': 1}, {'low': 2}]   # entry 0 corresponds to sample 1 and the next to sample 2

B=[{'hi':1},{'hi':2}]
print(B)
[{'hi': 1}, {'hi': 2}]   # entry 0 corresponds to sample 1 and the next to sample 2

C=[{}]*len(A)   # initialize list to contain a dictionary for each sample. Each dictionary will receive the corresponding values copied from A and B
print(C)
[{}, {}]

现在我尝试使用字典推导

{C[x].update(A[x]) for x in range(len(A))}
print(C)
[{'low': 2}, {'low': 2}]

结果不是我所期望的。我想要这样的东西:

[{'low':1,'high':1},{'low':1,'high':1}]

我在这里不明白什么......

谢谢

【问题讨论】:

  • 这是一个集合理解。
  • 您是否希望所有值都是 1,而不是 1 或 2?
  • 基于复杂胜于复杂,我鼓励在这里使用循环,字典理解很少清晰。
  • 如果您»想要在适当的字典中添加新条目«,为什么不直接使用列表中的.append() 来添加新字典?
  • 更新C时根本没有使用B

标签: python python-3.x dictionary python-3.4 dictionary-comprehension


【解决方案1】:

术语C=[{}]*len(A) 创建一个len(A) 条目列表,它们都是同一个字典。对C[0] 的更改也将更改C[1],因为两者是相同的。

使用C = [ {} for _ in A ] 创建一个新字典作为列表的每个元素。

但总而言之,正如我在上面的评论中提到的,我会考虑将新词典附加到现有列表中;这听起来很像您最初的意图。

【讨论】:

  • 谢谢你,创建了我最初期望的结果。
  • _ 只是一个变量(您也可以使用x 或其他)。使用_ 只是语法上需要但未使用的虚拟变量的约定。如果您使用通常命名的变量然后不使用它,典型的 IDE(如 PyDev)可能会针对未使用的变量发出警告。
【解决方案2】:

您需要同时使用AB 来更新C。这是一种可能的解决方案。

A=[{'low':1},{'low':2}]
B=[{'hi':1},{'hi':2}]

C = [dict(a.items() + b.items()) for a,b in zip(A, B)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2022-06-23
    • 2020-12-30
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多