Opt*_*esh 5 python iteration dictionary python-2.7
如果密钥的值低于某个阈值,我正试图从字典中删除项目.举个简单的例子我的意思是:
my_dict = {'blue': 1, 'red': 2, 'yellow': 3, 'green': 4}
for color in my_dict:
threshold_value = 3
if my_dict[color] < threshold_value:
del my_dict[color]
print(my_dict)
Run Code Online (Sandbox Code Playgroud)
现在,我收到一个RuntimeError: dictionary changed size during iteration
错误.没有什么大惊喜.我发布这个问题的原因是:
找出是否有一个优雅的解决方案,不需要创建一个新的字典(只包含值> =阈值的键).
试着理解Python的基本原理.我给自己读的方法是:"转到第一个键.该键的值是<x?如果是 - del这个键:值项目并继续字典中的下一个键,如果没有 - 继续下一个键没有做任何事情".换句话说,历史上发生在以前的键上的事情不应该影响我下一步的去向.无论过去如何,我都期待着接下来的项目.我知道这很有趣(有些人可能会说愚蠢,我会给你这个)但是Python对这个循环的"思考方式"是什么?为什么不起作用?Python如何大声读出它?只是想更好地理解语言......
vau*_*tah 10
由于Python字典是作为哈希表实现的,因此您不应该依赖它们具有任何类型的顺序.密钥顺序可能无法预测地改变(但仅在插入或移除密钥之后).因此,无法预测下一个关键.Python抛出RuntimeError
是安全的,并防止人们遇到意外的结果.
Python 2的dict.items
方法返回键值对的副本,因此您可以安全地迭代它并删除键不需要的值,如@wim在注释中建议的那样.例:
for k, v in my_dict.items():
if v < threshold_value:
del my_dict[k]
Run Code Online (Sandbox Code Playgroud)
但是,Python 3 dict.items
将返回一个视图对象,该对象反映了对字典所做的所有更改.这就是上面的解决方案仅适用于Python 2的原因.您可以转换my_dict.items()
为list
(tuple
等)以使其与Python 3兼容.
解决问题的另一种方法是选择要删除的密钥,然后将其删除
keys = [k for k, v in my_dict.items() if v < threshold_value]
for x in keys:
del my_dict[x]
Run Code Online (Sandbox Code Playgroud)
这适用于Python 2和Python 3.
归档时间: |
|
查看次数: |
5339 次 |
最近记录: |