Python 使用for循环从字典中删除项

Python 使用for循环从字典中删除项,python,python-2.7,dictionary,iteration,Python,Python 2.7,Dictionary,Iteration,如果键的值低于某个阈值,我将尝试从字典中删除项。举一个简单的例子来说明我的意思: 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) my_dict={'blue':1

如果键的值低于某个阈值,我将尝试从字典中删除项。举一个简单的例子来说明我的意思:

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)
my_dict={'blue':1,'red':2,'yellow':3,'green':4}
对于我的字典中的颜色:
阈值=3
如果我的dict[颜色]<阈值:
删除我的字典[颜色]
打印(我的字典)
现在,我得到一个
运行时错误:字典在迭代过程中改变了大小。没有什么大的意外。我发布此问题的原因是:

  • 了解是否有一个优雅的解决方案不需要创建新字典(只保存值>=阈值的键)

  • 在这里尝试理解Python的基本原理。我对自己的理解是:“转到第一个键。该键的值是否

  • 由于Python字典是作为哈希表实现的,因此您不应该依赖它们具有任何排序。密钥顺序可能会发生不可预测的变化(但仅在插入或移除密钥后)。因此,不可能预测下一个关键点。Python抛出
    RuntimeError
    以确保安全,并防止人们遇到意外结果

    Python2的方法返回键值对的副本,因此您可以安全地对其进行迭代,并按照注释中的建议删除键不需要的值。例如:

    for k, v in my_dict.items():
        if v < threshold_value:
            del my_dict[k]
    

    这在Python 2和Python 3中都适用。

    字典是无序的。通过删除一个键,没有人能说出下一个键是什么。因此,python通常不允许在字典中添加或删除键,而字典是迭代的

    只需创建一个新的:

    my_dict = {"blue":1,"red":2,"yellow":3,"green":4}
    new_dict = {k:v for k,v in my_dict.iteritems() if v >= threshold_value}
    

    我想在迭代集合时修改集合是很难正确实现的。考虑以下几个方面:

    >>> list = [1, 2, 3, 4, 5, 6]
    >>> for ii in range(len(list)):
      print list[ii]; 
      if list[ii] == 3:
        del list[ii]      
     1
     2
     3
     5
     6
    
    请注意,在本例中,完全省略了4。这在字典中非常相似,删除/添加条目可能会使定义迭代顺序的内部结构失效(例如,您删除了足够多的条目,所以哈希映射桶大小发生了更改)


    要解决您的问题,只需创建新词典并将条目复制到那里。至于

    正如我在专栏中所说的,我不想创造一个新的格言。你要求的是一种优雅的方式。但是你可以编写任何你喜欢的程序。
    >>> list = [1, 2, 3, 4, 5, 6]
    >>> for ii in range(len(list)):
      print list[ii]; 
      if list[ii] == 3:
        del list[ii]      
     1
     2
     3
     5
     6