web-dev-qa-db-fra.com

Comment combiner deux listes dans un dictionnaire en Python?

J'ai deux listes de la même longueur:

[1,2,3,4] et [a,b,c,d]

Je veux créer un dictionnaire où j'ai {1:a, 2:b, 3:c, 4:d}

Quelle est la meilleure façon de faire cela?

74
SuperString
dict(Zip([1,2,3,4], [a,b,c,d]))

Si les listes sont grandes, vous devriez utiliser itertools.izip .

Si vous avez plus de clés que de valeurs et que vous souhaitez renseigner des valeurs pour les clés supplémentaires, vous pouvez utiliser itertools.izip_longest .

Ici, a, b, c et d sont des variables - cela fonctionnera correctement (tant qu'elles sont définies), mais vous signifiait ['a','b','c','d'] si vous les voulez comme des chaînes.

Zip prend le premier élément de chaque itérable et crée un tuple, puis le deuxième élément de chaque, etc., etc.

dict peut prendre un élément itérable, chaque élément interne itérable ayant deux éléments. Il utilise ensuite le premier comme clé et le second comme valeur pour chaque élément.

123
agf
>>> dict(Zip([1, 2, 3, 4], ['a', 'b', 'c', 'd']))
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

S'ils ne sont pas de la même taille, Zip tronquera le plus long.

12
Josh Lee
dict(Zip([1,2,3,4], ['a', 'b', 'c', 'd']))

http://docs.python.org/library/functions.html

4
Elf Sternberg

S'il existe dans la première liste des clés en double mappant des valeurs différentes dans la deuxième liste, comme une relation 1 à plusieurs, mais que vous avez besoin de combiner ou d'ajouter des valeurs ou quelque chose au lieu de se mettre à jour, procédez comme suit:

i = iter(["a", "a", "b", "c", "b"])
j = iter([1,2,3,4,5])
k = list(Zip(i, j))
for (x,y) in k:
    if x in d:
        d[x] = d[x] + y #or whatever your function needs to be to combine them
    else:
        d[x] = y

Dans cet exemple, d == {'a': 3, 'c': 4, 'b': 8}

3
Dan Mantyla

Je ne connais pas le meilleur (le plus simple? Le plus rapide? Le plus lisible?), Mais une solution serait:

dict(Zip([1, 2, 3, 4], [a, b, c, d]))
2
Remy Blank

J'ai eu besoin de créer un dictionnaire de trois listes (latitude, longitude et une valeur), avec ce qui suit:

> lat = [45.3,56.2,23.4,60.4]
> lon = [134.6,128.7,111.9,75.8]
> val = [3,6,2,5]
> dict(Zip(zip(lat,lon),val))
{(56.2, 128.7): 6, (60.4, 75.8): 5, (23.4, 111.9): 2, (45.3, 134.6): 3}

ou similaire aux exemples ci-dessus:

> list1 = [1,2,3,4]
> list2 = [1,2,3,4]
> list3 = ['a','b','c','d']
> dict(Zip(zip(list1,list2),list3))
{(3, 3): 'c', (4, 4): 'd', (1, 1): 'a', (2, 2): 'b'}

Remarque: Les dictionnaires sont "sans ordre", mais si vous souhaitez le voir comme "trié", reportez-vous à CETTE question si vous souhaitez trier par clé ou CECI question si vous souhaitez trier par valeur.

0
ryanjdillon