包含字典元素的字典理解
Dictionary comprehension containing dictionary elements
我有以下格式的字典:
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 = {(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]}
不是我使用了切片所以它们是 values/lists 的副本,而不是实际列表
这样看起来不错...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 if you're using more complicated structure than tuples (specifically, mutable values)
在一行中,这相当于
dict2 = { key : val[0] for key, val in dict1.items() }
这样做的额外好处是可以避免原始实现中的引用问题。同样,如果你有可变类型(例如,列表列表而不是整数元组,你的值仍然有可能指向同一个地方,导致意外行为)
还有一些subtle differences between dictionaries in python2 and python3。上面的字典理解应该适用于两者
我有以下格式的字典: 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 = {(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]}
不是我使用了切片所以它们是 values/lists 的副本,而不是实际列表
这样看起来不错...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 if you're using more complicated structure than tuples (specifically, mutable values)
在一行中,这相当于
dict2 = { key : val[0] for key, val in dict1.items() }
这样做的额外好处是可以避免原始实现中的引用问题。同样,如果你有可变类型(例如,列表列表而不是整数元组,你的值仍然有可能指向同一个地方,导致意外行为)
还有一些subtle differences between dictionaries in python2 and python3。上面的字典理解应该适用于两者