惯用语表达式,用于从Python 3中的字典中临时删除键值对

时间:2018-11-24 03:33:40

标签: python python-3.x

查看标题:总体思路是:

d = {'a': 1, 'b': 2, 'b': 3}
print(d.without('b', 'c'))  # {'a': 1}
print(d)  # {'a': 1, 'b': 2, 'b': 3}

假设without的签名是(*keys)

4 个答案:

答案 0 :(得分:4)

一种解决方案是使用字典理解来创建临时字典:

d = {'a': 1, 'b': 2, 'b': 3}
print({ key : value for key, value in d.items() if key not in ('b','c')})
print(d)

输出

{'a': 1}
{'a': 1, 'b': 2, 'b': 3}

答案 1 :(得分:3)

dict理解是拉出一部分键并制作新词典的好方法,无论您要保留还是删除项:

def only_keys(dictionary, *keys):
     allowed = set(keys)
     return { k: v for k, v in dictionary.iteritems() if k in allowed }

def without_keys(dictionary, *keys):
     prohibited = set(keys)
     return { k: v for k, v in dictionary.iteritems() if k not in prohibited }

如果字典很小(或者运行时性能不是关键问题),这可能比更改字典然后再次将其变回更简单。

如果字典真的很大,最好动态地过滤整个字典,这样就不会产生将其全部复制的内存成本(再次而不是删除并替换它们)。像这样的事情会给您字典中与您的键列表匹配的键-值对,而无需创建一个全新的字典

 def filter_dict(dictionary, *allowed_keys):
     allowed = set(allowed_keys)
     for k, v in dictionary.iteritems():
         if k in allowed:
            yield k, v

对结果进行迭代将为您提供原始字典中具有允许键的所有键-值对(反之将以相同的方式工作,除了与先前示例中的相反,not in之外。 / p>

答案 2 :(得分:2)

我将使用字典理解来根据条件过滤出字典项。这将创建一个新字典,保留旧字典:

d = {'a': 1, 'b': 2, 'b': 3}
print({k: v for k, v in d.items() if k not in ['b', 'c']})  # {'a': 1}
print(d)  # {'a': 1, 'b': 2, 'b': 3}

答案 3 :(得分:1)

您可以继承dict ...

class MyDict(dict):
    def without(self, *keys):
        return MyDict({k:v for k,v in self.items() if k not in keys})


d = MyDict(a=1, b=2, c=3, d=4)
print(d.without('a', 'c')) #{'b': 2, 'd': 4}