2015-10-12 3 views
21

Учитывая следующий словарь:Mapping значение словаря в список

dct = {'a':3, 'b':3,'c':5,'d':3} 

Как я могу применить эти значения к списку таких как:

lst = ['c', 'd', 'a', 'b', 'd'] 

для того, чтобы получить что-то вроде:

lstval = [5, 3, 3, 3, 3] 
+6

Что произойдет, если значение в списке отсутствует в словаре? –

+1

Итак, вы хотите * получить * эти ключи в список (используйте 'list (dict.keys())'), или у вас уже есть такой список? И, кстати, не используйте 'dict' как имя переменной. –

+1

Возможный дубликат [Python dictionary: Получить список значений для списка ключей] (http://stackoverflow.com/questions/18453566/python-dictionary-get-list-of-values-for-list-of-keys) –

ответ

25

Использование map:

>>> map(dct.get, lst) 
[5, 3, 3, 3, 3] 

Использование list comprehension:

>>> [dct[k] for k in lst] 
[5, 3, 3, 3, 3] 
+2

. Кажется, что лучше всего использовать карту, вам не нужна лямбда для этого. –

+3

'map' one будет беспорядочным, если требуется не-None по умолчанию ... –

+12

Стоит отметить, что в python 3.x вам нужно ввести' list (map (dct.get, lst)) ', чтобы получить фактические результаты назад, иначе вы получите объект итератора. – Leb

8

Вы можете перебирать ключи из своего списка, используя map Функция:

lstval = list(map(dct.get, lst)) 

Или, если вы предпочитаете список понимание:

lstval = [dct[key] for key in lst] 
13

Вы можете использовать список понимание этого:

lstval = [ dct.get(k, your_fav_default) for k in lst ] 

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

+0

[Зачем использовать list-comp над 'map'?] (https://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists) * Особенно сложным является map(), вызываемый для побочных эффектов функции; правильное преобразование состоит в том, чтобы использовать регулярный цикл (так как создание списка будет просто расточительным). * :) –

+0

@Oleg: Вот почему у меня есть 'dct.get (k, your_fav_default)' на месте. Если значения отсутствуют, он должен вернуть символ 'your_fav_default' –

3

Не используйте dict в качестве имени переменной, так как он был построен в.

>>> d = {'a':3, 'b':3,'c':5,'d':3} 
>>> lst = ['c', 'd', 'a', 'b', 'd'] 
>>> map(lambda x:d.get(x, None), lst) 
[5, 3, 3, 3, 3] 
6
lstval = [d[x] for x in lst] 

Не называйте ваш словарь dict. dict - это имя типа.

2

Я хотел бы использовать список понимание:

listval = [dict.get(key, 0) for key in lst] 

.get(key, 0) часть используется для возвращения значения по умолчанию (в этом случае 0), если ни один элемент с этим ключом не существует в dict.

+0

@Oleg Код выполняет итерацию по элементам 'lst' not keys в словаре. Таким образом, может быть что-то в 'lst' и никакого соответствующего ключа в dict (даже если это не имеет большого смысла), и нам нужно обработать этот случай. – TobiMarg

0

В документации Python 3:

Итак, zip(*d.items()) дать свой результат.

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4} 

print(d.items())  # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2 
         # dict_items([('a', 1), ('c', 3), ('b', 2), ('d', 4)]) in Python 3 

print(zip(*d.items())) # [('a', 1), ('c', 3), ('b', 2), ('d', 4)] in Python 2 
         # <zip object at 0x7f1f8713ed40> in Python 3 

k, v = zip(*d.items()) 
print(k)    # ('a', 'c', 'b', 'd') 
print(v)    # (1, 3, 2, 4) 
Смежные вопросы