dict_you_want = { your_key: old_dict[your_key] for your_key in your_keys }
Uses dictionary comprehension.
If you use a version which lacks them (ie Python 2.6 and earlier), make it dict((your_key, old_dict[your_key]) for ...). It’s the same, though uglier.
Note that this, unlike jnnnnn’s version, has stable performance (depends only on number of your_keys) for old_dicts of any size. Both in terms of speed and memory. Since this is a generator expression, it processes one item at a time, and it doesn’t looks through all items of old_dict.
Removing everything in-place:
unwanted = set(keys) - set(your_dict)
for unwanted_key in unwanted: del your_dict[unwanted_key]
回答 1
dict理解稍微更优雅:
foodict ={k: v for k, v in mydict.items()if k.startswith('foo')}
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
Here’s an example:
my_dict = {"a":1,"b":2,"c":3,"d":4}
wanted_keys = ("c","d")
# run it
In [10]: dictfilt(my_dict, wanted_keys)
Out[10]: {'c': 3, 'd': 4}
It’s a basic list comprehension iterating over your dict keys (i in x) and outputs a list of tuple (key,value) pairs if the key lives in your desired key list (y). A dict() wraps the whole thing to output as a dict object.
Given your original dictionary orig and the set of entries that you’re interested in keys:
filtered = dict(zip(keys, [orig[k] for k in keys]))
which isn’t as nice as delnan’s answer, but should work in every Python version of interest. It is, however, fragile to each element of keys existing in your original dictionary.
What if one of your wanted keys aren’t in the old_dict? The delnan solution will throw a KeyError exception that you can catch. If that’s not what you need maybe you want to:
only include keys that excists both in the old_dict and your set of wanted_keys.
old_dict = {'name':"Foobar", 'baz':42}
wanted_keys = ['name', 'age']
new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())}
>>> new_dict
{'name': 'Foobar'}
have a default value for keys that’s not set in old_dict.
default = None
new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys}
>>> new_dict
{'age': None, 'name': 'Foobar'}
回答 8
此功能可以解决问题:
def include_keys(dictionary, keys):"""Filters a dict by only including certain keys."""
key_set = set(keys)& set(dictionary.keys())return{key: dictionary[key]for key in key_set}
def exclude_keys(dictionary, keys):"""Filters a dict by excluding certain keys."""
key_set = set(dictionary.keys())- set(keys)return{key: dictionary[key]for key in key_set}
def include_keys(dictionary, keys):
"""Filters a dict by only including certain keys."""
key_set = set(keys) & set(dictionary.keys())
return {key: dictionary[key] for key in key_set}
Just like delnan’s version, this one uses dictionary comprehension and has stable performance for large dictionaries (dependent only on the number of keys you permit, and not the total number of keys in the dictionary).
And just like MyGGan’s version, this one allows your list of keys to include keys that may not exist in the dictionary.
And as a bonus, here’s the inverse, where you can create a dictionary by excluding certain keys in the original:
def exclude_keys(dictionary, keys):
"""Filters a dict by excluding certain keys."""
key_set = set(dictionary.keys()) - set(keys)
return {key: dictionary[key] for key in key_set}
Note that unlike delnan’s version, the operation is not done in place, so the performance is related to the number of keys in the dictionary. However, the advantage of this is that the function will not modify the dictionary provided.
Edit: Added a separate function for excluding certain keys from a dict.
回答 9
如果我们要删除选定的键来制作新字典,可以利用字典理解功能
,例如:
d ={'a':1,'b':2,'c':3}
x ={key:d[key]for key in d.keys()-{'c','e'}}# Python 3
y ={key:d[key]for key in set(d.keys())-{'c','e'}}# Python 2.*# x is {'a': 1, 'b': 2}# y is {'a': 1, 'b': 2}
If we want to make a new dictionary with selected keys removed, we can make use of dictionary comprehension
For example:
d = {
'a' : 1,
'b' : 2,
'c' : 3
}
x = {key:d[key] for key in d.keys() - {'c', 'e'}} # Python 3
y = {key:d[key] for key in set(d.keys()) - {'c', 'e'}} # Python 2.*
# x is {'a': 1, 'b': 2}
# y is {'a': 1, 'b': 2}
[s.pop(k) for k in list(s.keys()) if k not in keep]
As most of the answers suggest in order to maintain the conciseness we have to create a duplicate object be it a list or dict. This one creates a throw-away list but deletes the keys in original dict.
回答 12
这是del在一个衬管中使用的另一种简单方法:
for key in e_keys:del your_dict[key]
e_keys是要排除的键的列表。它会更新您的词典,而不是给您一个新的词典。
如果需要新的输出字典,请在删除之前复制该字典:
new_dict = your_dict.copy()#Making copy of dictfor key in e_keys:del new_dict[key]