2013-06-12 2 views
3

ОК это Python вопрос:Распаковка пара ключ/значение из словаря

Это мы есть словарь:

my_dict = { 
      ('John', 'Cell3', 5): 0, 
      ('Mike', 'Cell2', 6): 1, 
      ('Peter', 'Cell1', 6): 0, 
      ('John', 'Cell1', 4): 5, 
      ('Mike', 'Cell2', 1): 4, 
      ('Peter', 'Cell1', 8): 9 
      } 

Как вы сделать еще один словарь, который имеет только пару ключ/значение, которое имеет имя «Питер» в нем?

ли это поможет, если вы включите этот словарь в список кортежей кортежей, по

tupled = my_dict.items() 

, а затем превратить его обратно в словарь снова?

Как вы решаете это с пониманием списка?

Заранее благодарен!

ответ

5

Попробуйте это, используя имеющийся dictionary comprehensions в Python 2.7 или новее:

{ k:v for k,v in my_dict.items() if 'Peter' in k } 

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

{ k:v for k,v in my_dict.items() if k[0] == 'Peter' } 

Если вы используете старую версию Python, мы можем получить эквивалентный результат с помощью выражений генератора и правильные параметры для dict() конструктора:

dict((k,v) for k,v in my_dict.items() if k[0] == 'Peter') 

Во всяком случае, результат, как и ожидалось:

=> {('Peter', 'Cell1', 8): 8, ('Peter', 'Cell1', 6): 0} 
0
{item for item in my_dict.iteritems() if item[0][0].lower() == 'peter'} 

.iteritems перебирает Dict, и мы используем .lower, чтобы соответствовать без чувствительности к регистру.

0

для любого имени

def select(d, name): 
    xs = {} 
    for e in d: 
     if e[0].lower() == name.lower(): xs[e] = d[e] 

    return xs 

d = {('Alice', 'Cell3', 3): 9, 
    ('Bob', 'Cell2', 6): 8, 
    ('Peter', 'Cell1', 6): 0, 
    ('Alice', 'Cell1', 6): 4, 
    ('Bob', 'Cell2', 0): 4, 
    ('Peter', 'Cell1', 8): 8 
    } 

print select(d, 'peter') 

>>>{('Peter', 'Cell1', 8): 8, ('Peter', 'Cell1', 6): 0} 
Смежные вопросы