【问题标题】:Deleting from dict if found in new list in Python如果在 Python 的新列表中找到,则从 dict 中删除
【发布时间】:2010-12-13 22:00:09
【问题描述】:

假设我有一本包含任意数量值的字典。 然后我创建一个列表。 如果在字典中找到列表的任何值,无论它是键还是索引,如何删除完整值?

例如:

dictionary = {1:3,4:5}
list = [1]
...
    dictionary = {4:5}

如何在不创建新字典的情况下执行此操作?

【问题讨论】:

  • 你的意思是不管是key还是value?所以在你的例子中,如果你有 list = [3] 你会期待同样的结果吗?

标签: python dictionary merge list


【解决方案1】:

由于您的“价值观”要求,这有点复杂:

>>> dic = {1: 3, 4: 5}
>>> ls = set([1])
>>> dels = []
>>> for k, v in dic.items():
    if k in ls or v in ls:
        dels.append(k)

>>> for i in dels:
    del dic[i]

>>> dic
{4: 5}

【讨论】:

  • 我们似乎以不同的方式解释了这个问题——他指的是列表中的值,以及字典中的键/索引。我认为他想删除列表中键所在的字典中的所有键值对。
  • 为什么要创建额外的“dels”列表?为什么不直接删除项目?
  • 因为我正在迭代 dict,而这样的删除会引发 RuntimeError
  • @Dominic:dict 中没有索引之类的东西,我能解释这个问题的唯一明智方法是假设 OP 表示键和值。
【解决方案2】:
dictionary = {1:3,4:5}
list = [1]

for key in list:
  if key in dictionary:
     del dictionary[key]

【讨论】:

  • 这只会删除以 1 作为键的条目。该问题还要求删除值匹配 1 的条目。
  • @twneale - 在我看来,这个问题是模棱两可的 - 问题要求删除字典中列表中所有值的“键或索引”。有些人将字典索引解释为值,但这对我来说没有意义。
【解决方案3】:

我会这样做:

for i in list:
    if dictionary.has_key(i):
         del dictionary[i]

但我相信还有更好的方法。

【讨论】:

  • del 是正确的(没有关键字 delete!-)但 has_key 没用(好多更好:if i in dictionary:)。
  • 它被称为我的设置为无。我误解了 OP 想将其设置为 none。
【解决方案4】:
>>> dictionary = {1:3,4:5}
>>> list = [1]
>>> for x in list:
...     if x in dictionary:
...             del(dictionary[x])
... 
>>> dictionary
{4: 5}

【讨论】:

    【解决方案5】:
    for key, value in list(dic.items()):
        if key in lst or value in lst:
            del dic[key]
    

    无需创建单独的列表或字典。

    我将“它是否是键或索引”解释为“它是否是键或值[在字典中]”

    【讨论】:

    • 我认为这在 Python 3 中中断,dict.items() 返回一个生成器。在这种情况下最好做for k, v in list(d.items())
    【解决方案6】:

    更多测试用例来定义我如何解释您的问题:

    #!/usr/bin/env python
    
    def test(beforedic,afterdic,removelist):
        d = beforedic
        l = removelist
        for i in l:
            for (k,v) in list(d.items()):
                if k == i or v == i:
                    del d[k]
    
        assert d == afterdic,"d is "+str(d)
    
    test({1:3,4:5},{4:5},[1])
    test({1:3,4:5},{4:5},[3])
    test({1:3,4:5},{1:3,4:5},[9])
    test({1:3,4:5},{4:5},[1,3])
    

    【讨论】:

      【解决方案7】:

      如果字典足够小,那么制作一个新字典会更容易。从字典d中删除所有键在集合s中的项目:

      d = dict((k, v) for (k, v) in d.items() if not k in s)
      

      从字典d中删除所有键或值在集合s中的项目:

      d = dict((k, v) for (k, v) in d.items() if not k in s and not v in s)
      

      【讨论】:

        【解决方案8】:
        def remKeys(dictionary, list):
            for i in list:
                if i in dictionary.keys():
                    dictionary.pop(i)
            return dictionary
        

        【讨论】:

          【解决方案9】:

          这样做的唯一方法是:

          [dictionary.pop(x) for x in list if x in dictionary.keys()]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-01
            • 2019-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-14
            • 2022-06-10
            • 2019-10-20
            相关资源
            最近更新 更多