2015-11-04 4 views
1

Концептуально, вот что я хочу сделать:Python: Создание словаря с помощью списка понимание из списка с помощью лямбда

lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'} 
keys = ['A', 'B', 'Z'] # Note 'Z' does not exist in dict 
result = {} 
for key in keys: 
    if key in lookup: 
     result[key] = lookup[key] 
    else: 
     result[key] = None 

Приведенный выше код дает следующее, т.е.

# result == {'A': 'aaa', 'Z': None, 'B': 'bbb'} 

Основываясь на советовании в this post about dictionary comprehension syntax я могу сделать следующее, используя v2.6 синтаксис:

result = dict((lambda x: (x, lookup[x]) if x in lookup else (x, None))(key) for key in keys) 

Что работает и дает одинаковые результаты.

Однако я надеялся, что смогу сделать следующее в стиле v2.7 (также упоминается в вышеприведенном сообщении). Но это не похоже на работу,

result = { (lambda x: x: a_dict[x] if x in a_dict else x: None)(key) for key in a_list } 

Я, кажется, вступая в противоречие с использованием : в лямбда с тем, что в обозначении ключ. Я также рассмотрел примеры, приведенные в original PEP. Они также не дают никаких указаний. Ниже приведен вывод из командной строки:

>>> result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list } 
    File "<stdin>", line 1 
    result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list } 
          ^
SyntaxError: invalid syntax 

Что я делаю неправильно? Можно ли делать то, что я пытаюсь сделать, т. Е. Использовать синтаксис словаря для v2.7 с помощью лямбда?

Обратите внимание, что я спрашиваю только из любопытства; дело не в том, что у меня есть принуждение написать такой производственный код, который потребует от эксперта понять!

PS: Я должен упомянуть две другие связанные должности, которые я нашел полезными, пытаясь сделать это. Сначала около using lambda in list comprehension. И еще creating a dictionary using list.

ответ

3

Чтобы сделать то, что вы пытаетесь использовать в словаре, вы должны использовать метод dict.get(). Пример -

>>> lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'} 
>>> keys = ['A', 'B', 'Z'] 
>>> result = {key:lookup.get(key) for key in keys} 
>>> result 
{'Z': None, 'A': 'aaa', 'B': 'bbb'} 

dict.get() возвращает None если ключ не присутствует в словаре. Вы также можете указать второй аргумент dict.get(), который будет возвращен по умолчанию, если ключ, который вы пытаетесь сделать , получает в словаре.


Чтобы ответить на этот вопрос, вы не можете использовать lambda вернуть что-то вроде ключа: пары значений в словаре понимания (так как синтаксис : не действует). Если вы хотите сделать это, вы должны использовать dict() функцию с выражением генератора, пример -

result = dict((lambda x: (x,a_dict[x]) if x in a_dict else (x,None))(key) for key in a_list) 

или более читаемым map() версии -

result = dict(map((lambda x: (x,a_dict[x]) if x in a_dict else (x,None)), a_list) 
+0

Благодаря @Anand это помогает. Оба ответа избавляют меня от необходимости использовать лямбда. Однако вторая часть моего вопроса остается без ответа, т. Е. Можно использовать лямбда при использовании синтаксиса понимания словаря v2.7. –

+0

@AlokLal Ответил на ваш вопрос в ответе, пожалуйста, проверьте его. –

+0

очень полезно. Благодаря! –

1

То, что вы пытаетесь сделать, может быть сделано с простой словарь понимание:

result = {k: lookup.get(k) for k in keys} 

k будет ключом и lookup.get(k) будет значение..get() получит значение ключа из словаря или None, если его нет. Значение по умолчанию также может быть установлено как 2-й аргумент.

+0

Спасибо за ваш ответ @Klaus, это помогает. Я опубликовал ответ на предыдущий ответ. –