在使用 dict.values() 或 dict.itervalues() 遍历时修改字典值
我有一个字典,初始化的方式是这样的:
tab = {'Mike': 0, 'Chad': 15, 'Taylor': 2}
我想给字典里的每个值加上整数。
比如,加上5之后,字典应该变成这样:
{'Mike': 5, 'Chad': 20, 'Taylor': 7}
看起来这可以用几行代码来实现,但我搞不清楚怎么做。
我试过用一个循环:
for k in tab.itervalues():
k = k + 5
我运行了这段代码,然后打印出字典:
tab = {'Mike': 0, 'Chad': 15, 'Taylor': 2}
结果字典没有任何变化。我不确定Python是否把这些值当成字符串还是整数。
2 个回答
7
tab.itervalues()
会创建一个值的迭代器。
你可以逐个遍历这些值,每次会得到一个值。这些值是 int
类型的。在 Python 中,这些值是不可变的。
在 Python 中,语句 a += 3
在大多数情况下会被理解为 a = a + 3
。这里的 a + 3
会创建一个新的整数对象,如果 a
原本指向一个整数,然后 a
这个名字就会重新指向这个新对象。
所以你可以改变迭代变量(通过重新绑定它),但不能改变字典中的值(因为它是不可变的)。
waffle paradox's solution 通过使用键的迭代器来访问并重新绑定字典中的值,解决了这个问题。这种方法简单且符合 Python 的风格,非常不错。
另外,你也可以接受不可变性,并采用函数式编程的思路。我们想要创建一个字典,和现在的字典类似,但键值增加;让 tab
指向这个新字典只是顺便的事情。
因此:
tab = dict((k, v + 5) for (k, v) in tab.iteritems())
这种方法在你遇到基于同样基本问题的更复杂问题时,通常会让你的生活更轻松。
17
最简单的方法是什么呢?
for k in tab.keys():
tab[k] += 5