[Python] Фильтр dict содержит только определенные клавиши?


Answers

Вот пример в python 2.6:

>>> a = {1:1, 2:2, 3:3}
>>> dict((key,value) for key, value in a.iteritems() if key == 1)
{1: 1}

Фильтрационная часть является оператором if .

Этот метод медленнее ответа delnan, если вы хотите только выбрать несколько очень многих ключей.

Question

У меня есть dict который содержит целую кучу записей. Меня интересуют только некоторые из них. Есть ли простой способ обрезать все остальные?




Короткая форма:

[s.pop(k) for k in list(s.keys()) if k not in keep]

Как следует из большинства ответов, чтобы сохранить краткость, мы должны создать дублированный объект, будь то list или dict . Это создает list удалений, но удаляет ключи в оригинальном dict .




Этот один лайнер должен работать:

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}

Это базовое понимание списка, повторяющееся по вашим ключам dict (i в x), и выводит список пар кортежей (ключ, значение), если ключ находится в списке нужных ключей (y). A dict () обертывает все, что выводится как объект dict.




Вы можете сделать это с помощью функции project из моей библиотеки funcy :

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

Также взгляните на select_keys .




На основании принятого ответа delnan.

Что делать, если один из ваших желаемых ключей не находится в old_dict? Решение delnan выдает исключение KeyError, которое вы можете поймать. Если это не то, что вам нужно, возможно, вы хотите:

  1. только включают ключи, которые активируют как в old_dict, так и в вашем наборе Want_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'}
    
  2. имеют значение по умолчанию для ключей, которые не установлены в 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'}