2016-10-31 2 views
1

Итак, у меня есть упорядоченный словарь, и у него есть куча пар ключ/значение. Я могу извлечь ВСЕ их с помощью метода items(). Но что, если я только хочу выбрать НЕКОТОРЫЕ из них?Подмножество полей из упорядоченного номера?

>>> import collections 
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2}) 
>>> d.items() 
[('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)] 

Что делать, если я просто хочу яблоко и банан?

Есть ли способ указать ключи, которые я хочу?

>>> d['apple','banana'] <-- does not work 

Я рассматривал, используя список понимание в конце, чтобы отфильтровать результаты, но, кажется, грязный, и я надеюсь, что есть лучший путь.

+0

Что вам понравится 'd ['apple', 'banana']' to production? – martineau

+0

Список кортежей или пары ключ/значение, то же, что и .items(). – Exie

ответ

0

Вы, скорее всего, закончите с использованием понимания списка так или иначе. Вот способ похоронить список понимание в реализации метода:

from collections import OrderedDict 

class MultOrderedDict(OrderedDict): 
    def items(self, *items): 
     all = super(MultOrderedDict, self).items() 
     if not items: 
      return all 
     return type(self)((key, value) for (key, value) in all if key in items).items() 

С этим определением класса (при условии, что это в multorddict.py) вы можете сделать что-то вроде этого:

>>> from multorddict import MultOrderedDict 
>>> mod = MultOrderedDict(banana=3, apple=4, pear=1, orange=2) 
>>> mod.items() 
[('orange', 2), ('pear', 1), ('apple', 4), ('banana', 3)] 
>>> mod.items('apple','banana') 
[('apple', 4), ('banana', 3)] 
>>> 

Этот подход меняет семантику метода items, который, возможно, не так хорош.

+0

Это не возвращает список кортежей или пар ключ/значение, то же самое, что и 'items()'. Он также бесконечно рекурсирует, когда выполняется 'mod ['apple', 'banana']'. – martineau

+0

Согласен, я не тестировал свою первоначальную реализацию в python2 (у нее нет такой же проблемы в python3). Я бы просто удалил ответ, если бы он не был принят, но я переформулировал его, чтобы переопределить 'items', а не' __getitem__'. В конечном счете, имеет смысл лучше разобраться со списками и использовать их напрямую. –

1

Я не знаю метода, который существует, но, возможно, стоит создать общий метод, если это то, что вам нужно сделать, используя свою базу кода. Может быть что-то вроде

>>> specific_dict_items = lambda d, l: [(key, d.get(key, '')) for key in l] 
>>> specific_dict_items({1:1, 2:2, 3:3, 4:4, 5:5}, [1, 3, 5, 7]) 
[(1, 1), (3, 3), (5, 5), (7, '')] 
3

Вы можете определить одну прокладку, чтобы сделать это:

>>> import collections 
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2}) 
>>> d.items() 
[('orange', 2), ('pear', 1), ('banana', 3), ('apple', 4)] 
>>> 
>>> subset = lambda d, *keys: [(key, d[key]) for key in keys] 
>>> subset(d, 'apple', 'banana') 
[('apple', 4), ('banana', 3)] 

В качестве бонуса он также работает с регулярными dict объектов.

Смежные вопросы