包含字典元素的字典理解

时间:2015-11-24 18:24:02

标签: python dictionary list-comprehension

我有以下格式的字典: 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]

我觉得可能有办法通过词典理解来做到这一点。 有可能吗?

2 个答案:

答案 0 :(得分:4)

这种方式看起来不错...... 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。上面的字典理解应该适用于

答案 1 :(得分: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]}

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