【问题标题】:Remove a dictionary key that has a certain value [duplicate]删除具有特定值的字典键[重复]
【发布时间】:2013-06-13 19:11:55
【问题描述】:

我知道字典不应该以这种方式使用,因此没有内置函数可以帮助做到这一点,但我需要删除字典中具有特定值的每个条目。

所以如果我的字典看起来像:

'NameofEntry1': '0'
'NameofEntry2': 'DNC'
 ...

我需要删除(可能弹出)所有具有 DNC 值的条目,字典中有多个条目。

【问题讨论】:

    标签: python


    【解决方案1】:

    您只需要确保在迭代字典时没有修改字典,否则您会得到RuntimeError: dictionary changed size during iteration。

    因此您需要遍历键、值的副本(对于 d 在 2.x 中使用 d.items() 或在 3.x 中使用 list(d.items()))

    >>> d = {'NameofEntry1': '0', 'NameofEntry2': 'DNC'}
    >>> for k,v in d.items():
    ...     if v == 'DNC':
    ...         del d[k]
    ... 
    >>> d
    {'NameofEntry1': '0'}
    

    【讨论】:

      【解决方案2】:

      修改原字典:

      for k,v in your_dict.items():
          if v == 'DNC':
             del your_dict[k]
      

      或使用字典理解创建一个新字典:

      your_dict = {k:v for k,v in your_dict.items() if v != 'DNC'}
      

      来自iteritems()、iterkeys()和itervalues()上的docs:

      在添加或时使用iteritems()、iterkeys() 或itervalues() 删除字典中的条目可能会引发RuntimeError 或失败 遍历所有条目。

      同样适用于普通的for key in dict: 循环。

      在 Python 3 中,这适用于 dict.keys()、dict.values() 和 dict.items()。

      【讨论】:

      • 我收到RuntimeError: dictionary changed size during iteration
      • @Climbs_lika_Spyder 检查最后一行关于 Python 3 的声明。
      • 在 Python 3 中,您需要 @jared 的回答中提到的 list(d.items())。
      【解决方案3】:

      这应该可行:

      for key, value in dic.items():
           if value == 'DNC':
               dic.pop(key)
      

      【讨论】:

        【解决方案4】:

        如果限制 re:在迭代字典时修改字典是一个问题,您可以创建一个与 dict 兼容的新类,该类存储具有给定值的所有键的反向索引(在创建/更新/删除 dict item),它可以是 del 的参数,而不需要遍历字典的项目。

        子类 dict,并覆盖 __setitem__、__delitem__、pop、popitem 和 clear。

        如果这是您经常做的操作,那可能会方便快捷。

        【讨论】:

          猜你喜欢
          • 2023-01-08
          • 2017-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-07-08
          • 1970-01-01
          • 1970-01-01
          • 2020-10-20
          • 1970-01-01
          相关资源
          最近更新 更多