在使用 dict.values() 或 dict.itervalues() 遍历时修改字典值

9 投票
2 回答
17803 浏览
提问于 2025-04-16 22:24

我有一个字典,初始化的方式是这样的:

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

撰写回答