我有一個dict
,裏面有不少條目。 我只對其中一些感興趣。 有沒有一種簡單的方法能夠將其餘全部元素都修剪掉? html
基於delnan接受的答案。 函數
若是您想要的鍵之一不在old_dict中怎麼辦? delnan解決方案將引起您能夠捕獲的KeyError異常。 若是那不是您所須要的,也許您想: 性能
僅在old_dict和您的通緝鑰匙組中包含存在的鑰匙。 spa
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'}
具備在old_dict中未設置的鍵的默認值。 code
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'}
此功能能夠解決問題: htm
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}
就像delnan的版本同樣,此版本使用字典理解,而且對於大型字典具備穩定的性能(僅取決於您容許的鍵數,而不取決於字典中的鍵總數)。 對象
就像MyGGan的版本同樣,此鍵容許您的鍵列表包含字典中可能不存在的鍵。 get
另外,這是相反的,您能夠在其中經過排除原稿中的某些鍵來建立字典: it
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}
請注意,與delnan版本不一樣,該操做未在適當位置完成,所以性能與字典中鍵的數量有關。 可是,這樣作的好處是該函數不會修改提供的字典。 io
編輯:添加了一個單獨的功能,用於從字典中排除某些鍵。
此一線性lambda應該工做:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
這是一個例子:
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}
這是對列表鍵(i在x中)進行迭代的基本列表理解,若是鍵位於所需的鍵列表(y)中,則輸出元組(鍵,值)對的列表。 dict()將整個內容包裝爲dict對象。
dict理解稍微更優雅:
foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}
from funcy import project small_dict = project(big_dict, keys)
還要看看select_keys 。