查看标题:总体思路是:
d = {'a': 1, 'b': 2, 'b': 3}
print(d.without('b', 'c')) # {'a': 1}
print(d) # {'a': 1, 'b': 2, 'b': 3}
假设without
的签名是(*keys)
答案 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}