過濾字典僅包含某些鍵?

我有一個dict ,裏面有不少條目。 我只對其中一些感興趣。 有沒有一種簡單的方法能夠將其餘全部元素都修剪掉? html


#1樓

基於delnan接受的答案。 函數

若是您想要的鍵之一不在old_dict中怎麼辦? delnan解決方案將引起您能夠捕獲的KeyError異常。 若是那不是您所須要的,也許您想: 性能

  1. 僅在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'}
  2. 具備在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'}

#2樓

此功能能夠解決問題: 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

編輯:添加了一個單獨的功能,用於從字典中排除某些鍵。


#3樓

此一線性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對象。


#4樓

dict理解稍微更優雅:

foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}

#5樓

您可使用個人函數庫中的項目函數來實現

from funcy import project
small_dict = project(big_dict, keys)

還要看看select_keys