【问题标题】:Dictionary comprehension containing dictionary elements包含字典元素的字典理解
【发布时间】:2016-02-27 07:58:10
【问题描述】:

我有一本格式如下的字典: dict1 = {(0, 1): [10, 11], (1, 2): [0, 0]}

我想创建另一个字典,保持键不变但删除第二个值,最好这不应该是一个列表(因为它只包含一个元素)

dict2 = {(0, 1): 10, (1, 2): 0} (甚至 {(0, 1): [10], (1, 2): [0]})

目前我正在这样做:

dict2 = dict1
for key, value in dict2.items():
    dict2[key] = value[0]

我觉得可能有一种方法可以通过字典理解来做到这一点。 有可能吗?

【问题讨论】:

  • 仅供参考,您的代码也会修改dict1

标签: python dictionary list-comprehension


【解决方案1】:

这种方式看起来不错...but isn't

dict2 = dict1
for key, value in dict2.items():
    dict2[key] = value[0]

print(dict2) # good so far
print(dict1) # oh no!

当我们说dict2 = dict1 时,我们所做的只是将变量名 dic2 指向存储在 dict1 中的字典。两个名字都指向同一个地方。从表面上看,

dict2 = dict1.copy()
for key, value in dict2.items():
    dict2[key] = value[0]

print(dict2) # good so far
print(dict1) # okay....

似乎可行,但如果您使用比元组更复杂的结构,您可能需要查找 shallow vs. deep copy (specifically, mutable values)

在一行中,这相当于

dict2 = { key : val[0] for key, val in dict1.items() }

这具有避免原始实现中的引用问题的额外好处。同样,如果您有可变类型(例如,列表列表而不是整数元组,您的值仍然有可能指向同一个地方,从而导致意外行为)

有一些subtle differences between dictionaries in python2 and python3。上面的字典理解应该适用于两者

【讨论】:

  • 很好的解释,非常清晰和启发性。有一个错字,你说“mutubale”我认为你的意思是可变的。非常感谢
【解决方案2】:

使用简单的 dict comp:

>>> dict1 = {(0, 1): [10, 11], (1, 2): [0, 0]}
>>> dict2 = {key:dict1[key][0] for key in dict1}
>>> dict2
{(0, 1): 10, (1, 2): 0}

您也可以将它放在一个值列表中:

>>> dict2 = {key:dict1[key][0:1] for key in dict1}
>>> dict2
{(0, 1): [10], (1, 2): [0]}

不是我使用切片,所以它们是值/列表的副本,而不是实际列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2019-10-10
    • 2021-07-24
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多