Python中如何压缩for loop?字典值修改场景的实现方法咨询
Python 压缩式循环(推导式)实现字典格式调整的方法
原代码基础问题修正
示例代码存在两处可直接影响运行的问题:
attacks.items是字典的内置方法,必须加括号写成attacks.items()才能返回可迭代的键值对序列,不加括号时迭代拿到的是方法对象本身,无法正常取值- 迭代键值对时可以直接解构成
key、value两个变量,无需通过i[0]、i[1]的索引方式取值,可读性更好
修正后可正常运行的常规循环写法为:
for key, value in attacks.items(): attacks[key] = value + round(value / level)
注:在迭代原字典的过程中直接修改已有键对应的值是Python允许的操作,只要不新增、删除字典的键,就不会触发迭代过程的运行错误。
压缩式循环的实现逻辑
技术书籍中提到的压缩for loop写法,本质是Python提供的推导式语法糖,核心是把多行循环的生成、赋值逻辑压缩到单行书写,没有特殊实现逻辑,执行效率和常规多行循环完全一致。
针对当前字典调整需求,对应的压缩式(字典推导式)写法为:
attacks = { key: value + round(value / level) for key, value in attacks.items() }
写法逻辑可完全对应到常规循环步骤:
- 大括号内冒号前的
key: value + round(value / level),对应循环中给键设置的新值,和原循环的赋值逻辑完全一致 - 冒号后跟随的
for key, value in attacks.items(),和常规循环的迭代遍历部分完全相同,逐一遍历原字典的所有键值对
如果需要在调整过程中增加过滤条件,只需要把条件判断跟在迭代语句后面即可,比如仅调整数值大于10的条目:
attacks = { key: value + round(value / level) for key, value in attacks.items() if value > 10 }
实用注意点
- 推导式只是更紧凑的书写方式,没有性能优势,选择多行循环还是推导式,完全取决于团队的代码可读性规范
- 用推导式生成新字典的方式比直接修改原字典更稳妥,尤其在需要对字典新增/删除键的场景下,不会触发迭代过程的字典结构变更报错
内容的提问来源于stack exchange,提问作者NOT A GIF
相关产品推荐
相关产品推荐

