2015-10-12 14 views
21

il seguente dizionario Dato:Mapping alla lista

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

Come posso applicare questi valori per una lista come ad esempio:

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

al fine di ottenere qualcosa di simile:

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

Cosa succede se il valore nell'elenco non è presente nel dizionario? –

+1

Quindi vuoi * ottenere * queste chiavi in ​​una lista (usa 'lista (dict.keys())'), o hai già una lista come quella? E a proposito, non usare 'dict' come nome di variabile. –

+1

Possibile duplicato di [dizionario Python: ottieni l'elenco dei valori per l'elenco delle chiavi] (http://stackoverflow.com/questions/18453566/python-dictionary-get-list-of-values-for-list-of-keys) –

risposta

25

Utilizzando map:

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

Utilizzando un list comprehension:

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

Questo sembra il migliore usando la mappa, non hai bisogno di lambda per questo. –

+3

'map' si incasina quando è richiesto un valore predefinito non-None ... –

+12

Vale la pena notare che in python 3.x è necessario digitare' list (map (dct.get, lst)) 'per ottenere risultati effettivi indietro, altrimenti otterrai un oggetto iteratore. – Leb

8

È possibile scorrere le chiavi dall'elenco utilizzando la funzione map:

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

O se preferite di lista:

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

è possibile utilizzare una comprensione lista per questo:

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

Personalmente propongo utilizzando list comprehensions over incorporato map perché sembra familiare a tutti i programmatori Python, è più semplice da analizzare ed estendere nel caso in cui sia richiesto un valore predefinito personalizzato.

+0

[Perché usare list-comp su 'map'?] (https://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists) * Particolarmente difficile è map() invocato per gli effetti collaterali della funzione; la trasformazione corretta consiste nell'usare un ciclo regolare (poiché creare una lista sarebbe solo dispendioso). * :) –

+0

@Oleg: Ecco perché ho 'dct.get (k, your_fav_default)' al suo posto. Se mancano dei valori dovrebbe restituire 'your_fav_default' –

3

Non utilizzare un dict come nome di variabile, come è stato costruito nel.

>>> 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] 

non chiami il dizionario dict. dict è il nome del tipo.

2

vorrei usare una lista di comprensione:

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

La parte .get(key, 0) viene utilizzato per restituire un valore predefinito (in questo caso 0) se nessun elemento con questa chiave è presente in dict.

+0

@Oleg Il codice sta iterando su elementi di 'lst' non chiavi nel dizionario. Quindi potrebbe esserci qualcosa in 'lst' e nessuna chiave corrispondente nel dict (anche quando ciò non avrebbe molto senso) e abbiamo bisogno di gestire quel caso. – TobiMarg

0

Nella documentazione di Python 3:

Quindi, zip(*d.items()) dare il vostro risultato.

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)