用循环更新字典

时间:2016-11-16 18:34:20

标签: python dictionary

鉴于这样的咒语:

d = {'pens': (3, 0), 'cups': (2, 0), 'coins': (7, 0)}

我正在尝试访问密钥来更新第二个attirbute,例如

for x,y,z in d.items():
    if x=='pens'
       z=5

为什么这不起作用?有什么解决方案呢?

6 个答案:

答案 0 :(得分:3)

只是做:

d = {'pens': (3, 0), 'cups': (2, 0), 'coins': (7, 0)}
if 'pens' in d:
    d['pens'] = (d['pens'][0], 5)

答案 1 :(得分:3)

您的解决方案无法工作的原因是因为元组是不可变的,这意味着无法更改内容。有类似的。其他语言的常量。此外,.items()返回一个两元组对,因此尝试用三个变量解包它应该会引发错误。

话虽如此,你可以利用字典理解和Python的三元运算符:

>>> d = {'pens': (3, 0), 'cups': (2, 0), 'coins': (7, 0)}
>>> d = {key: (val[0], 5) if key == 'pens' else val for key, val in d.items()}
>>> d
{'pens': (3, 5), 'cups': (2, 0), 'coins': (7, 0)}
>>> 

答案 2 :(得分:2)

z只是临时绑定到元组第二部分的值;它不是对元组本身的引用。你必须在原始字典中找到元组,然后更新它(由于元组是不可变的这一事实而复杂化)。尝试这样的事情:

for x, (y, z) in d.items():
    if x == 'pens':
        d[x] = (y, 5)

答案 3 :(得分:1)

你无法更新元组(字典中的值),因为元组是不可变的,所以你必须分配关键的新元组。这个循环的另一个问题是解压缩元组的方式。它应该是这样的

for x,(y,z) in d.items():
    if x=='pens':
       d[x] = (y, 5)

答案 4 :(得分:1)

因为您没有在字典中更改它。 你可以这样做:

if "pens" in d.keys():
    d["pens"] = (d["pens"][0], 5)

答案 5 :(得分:1)

这里有几个问题。

首先,items()返回一个iterable,其元素是2元素元组,每个元组的第一个是键,第二个是值。

在您的情况下,您需要打开"值"进一步的元组:

for x, value in d.items():
  y, z = value

其次,看起来你正试图用你的新值更新dict(" 5"),但你只有一个元素的副本,而值类型本身就是一个元组,是不可改变的。您无法更改元组的单个元素。因此,您必须使用新元组替换dict中的整个值元组:

for x, value in d.items():
    y, z = value
    if x == 'pens':
        d[x]  = (y, 5)

请注意,在迭代时更新字典或列表在某些情况下可能会出现问题。小心。