2013-04-05 3 views
4

J'ai utilisé ce code:Comment mapper plusieurs listes à un dictionnaire?

dictionary = dict(zip(list1, list2)) 

afin de cartographier deux listes dans un dictionnaire. Où:

list1 = ('a','b','c') 
list2 = ('1','2','3') 

Le dictionnaire est égal à:

{'a': 1, 'c': 3, 'b': 2} 

Y at-il un moyen d'ajouter une troisième liste:

list3 = ('4','5','6') 

de telle sorte que le dictionnaire sera égal à:

{'a': [1,4], 'c': [3,5], 'b': [2,6]} 

Cette troisième liste doit être ajoutée pour que suit la cartographie existante.

L'idée est de faire itérativement ce travail dans une boucle for et plusieurs dizaines de valeurs dans le mot-clé correctement mappé. Est-ce que quelque chose comme ça est possible?

Espérons que ma question soit suffisamment claire.

Répondre

11
dict((z[0],list(z[1:])) for z in zip(list1,list2,list3)) 

fonctionnera. Ou, si vous préférez la syntaxe un peu plus sympa dict-compréhension de python2.7 +

{z[0]:list(z[1:]) for z in zip(list1,list2,list3)} 

Cette échelles jusqu'à un nombre arbitraire de listes facilement:

list_of_lists = [list1,list2,list3,...] 
{z[0]:list(z[1:]) for z in zip(*list_of_lists)} 

Et si vous voulez convertir la tapez pour vous assurer que les listes de valeurs contiennent tous les entiers:

def to_int(iterable): 
    return [int(x) for x in iterable] 

{z[0]:to_int(z[1:]) for z in zip(*list_of_lists)} 

Bien sûr, vous pouvez le faire en 1 ligne, mais je préfère ne pas.

+0

Merci. C'est exactement ce dont j'avais besoin! – user1919

5
In [12]: list1 = ('a','b','c') 

In [13]: list2 = ('1','2','3') 

In [14]: list3 = ('4','5','6') 

In [15]: zip(list2, list3) 
Out[15]: [('1', '4'), ('2', '5'), ('3', '6')] 

In [16]: dict(zip(list1, zip(list2, list3))) 
Out[16]: {'a': ('1', '4'), 'b': ('2', '5'), 'c': ('3', '6')} 

In [17]: dict(zip(list1, zip(map(int, list2), map(int, list3)))) 
Out[17]: {'a': (1, 4), 'b': (2, 5), 'c': (3, 6)} 

In [18]: dict(zip(list1, map(list, zip(map(int, list2), map(int, list3))))) 
Out[18]: {'a': [1, 4], 'b': [2, 5], 'c': [3, 6]} 

Pour un nombre arbitraire de listes, vous pouvez le faire:

dict(zip(list1, zip(*(map(int, lst) for lst in (list2, list3, list4, ...))))) 

Ou, pour rendre les listes de valeurs plutôt que tuples,

dict(zip(list1, map(list, zip(*(map(int, lst) for lst in (list2, list3, list4, ...)))))) 
+1

Est-ce que quelque chose comme ça pourrait être modifié afin qu'il fonctionne pour n nombre de listes? – user1919

+1

+1. J'aime la version de 'dict (zip (keys, zip (values)))'. Surtout sur python3.x où 'zip' est paresseux. – mgilson

Questions connexes