【问题标题】:How to delete dictionary items if their keys are not in a list, using Python如果字典项的键不在列表中,如何使用 Python 删除它们
【发布时间】:2020-10-14 17:55:07
【问题描述】:

如何删除大量不在列表中的字典项?例如,有一个字典dct 和一个列表`lst:

dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
lst = ['a', 'c']

过滤掉字典的最有效方法是什么,从而得到:

dct.items()

输出:

dict_items([('a', 2), ('c', 6)])

谢谢!

【问题讨论】:

  • 你的标题问的是一件事,但你的问题问的是相反的。请调和两者,并展示您的尝试。
  • 谢谢Mad Physicist。一个诚实的错误......

标签: python dictionary del


【解决方案1】:

要求你改变现有的字典,还是生成一个新的、更小的字典好吗?

如果您可以生成一个新字典,则问题的措辞可能会将您引导至 Python 的过滤器功能,您将按照以下方式实现该功能(假设 key_list 是您要保留的键值列表):

 new_dict = filter(lambda pair: pair[0] in key_list, old_dict)

您也可以通过字典理解来做到这一点,如下所示:

 new_dict = { key : value for (key, value) in old_dict if key in key_list }

如果你绝对肯定必须改变原始字典,有办法在 Python 中的一行中做到这一点,但 Python 程序员并不完全清楚,所以我可能会在循环中这样做:

for key in old_dict:
     if key not in key_list:
          del old_dict[key]

这适用于 Python 2,但不适用于 Python 3,在 Python 3 中 for 循环内的删除将中断迭代。对于 Python 3(我认为),您需要执行以下操作:

del_keys = [ key for key in old_dict if key not in key_list ]
for key in del_keys:
     del old_dict[key]

【讨论】:

  • 你应该把你正在查找的东西变成set
  • 另外,遍历列表比遍历字典效率更高。我已经发布了一个答案来说明。
【解决方案2】:

获取新字典的最简单方法是遍历列表,而不是字典:

new_dict = {k: dct[k] for k in lst if k in dct}

请注意,这是 O(N) 在键上,而不是 O(M * N) 在键和字典上。查找k in dctO(1),而查找k in lstO(N)。假设列表比字典短,如果你有效地完成它比迭代字典要好,因为那将是O(M) > O(N)

如果您的列表保证包含字典元素的子集,您可以完全跳过检查if k in dct

如果您必须就地处理原始字典,则可以执行以下两项操作之一。更简单的解决方案是使用新字典:

new_dict = {k: dct[k] for k in lst if k in dct}
dct.clear()
dct.upate(new_dict)

如果这是作弊,您可以遍历字典。为了快速查找,先把列表变成一个集合:

s = set(lst)
for k in list(dct.keys()):
    if k not in lst:
        del dct[k]

【讨论】:

    【解决方案3】:

    这是一种方法:

    dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
    lst = ['b', 'd']
    ndct = {}
    for l in list(dct):
        if l in lst:
            pass
        else:
            ndct[l] = dct[l]
    

    ndct 等于:

    {'a': 2, 'c': 6}
    

    【讨论】:

      【解决方案4】:

      一个简单的代码:

      dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
      lst = ['b', 'd']
      
      for key in list(dct):
          if key in lst:
              dct.pop(key)
      

      结果:

      {'a': 2, 'c': 6}
      

      正如Mark Byers所说,必须使用list函数来获取key的副本,否则会出现“RuntimeError: dictionary changed size during iteration”的错误。适用于 python 版本 2 和 3。

      【讨论】:

        【解决方案5】:

        你可以找到字典键和列表值的交集:

        dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
        lst = ['a', 'c']
        
        {k: dct[k] for k in dct.keys() & lst}
        

        输出:

        {'c': 6, 'a': 2}
        

        【讨论】:

          【解决方案6】:

          您可以使用要从字典中删除的单词列表,如果列表中不存在键,则打印字典。 代码如下:

          dct={key:val for key, val in dct.items() if key not in lst}

          只需打印 dct.items() 即可获得所需的结果

          您将获得所需的字典输出,其中仅包含列表中不存在的值(lst)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-14
            • 1970-01-01
            • 2021-07-07
            • 2017-07-04
            • 2020-11-01
            相关资源
            最近更新 更多