鉴于这样的咒语:
d = {'pens': (3, 0), 'cups': (2, 0), 'coins': (7, 0)}
我正在尝试访问密钥来更新第二个attirbute,例如
for x,y,z in d.items():
if x=='pens'
z=5
为什么这不起作用?有什么解决方案呢?
答案 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)
请注意,在迭代时更新字典或列表在某些情况下可能会出现问题。小心。