web-dev-qa-db-fra.com

Convertir une liste en dictionnaire dans Python

Supposons que j’ai une liste a dans Python dont les entrées correspondent à un dictionnaire. Chaque élément pair représente la clé du dictionnaire et l'élément impair suivant est la valeur

par exemple,

a = ['hello','world','1','2']

et je voudrais le convertir en dictionnaire b, où

b['hello'] = 'world'
b['1'] = '2'

Quel est le moyen le plus propre syntaxiquement pour accomplir cela?

170
Mike
b = dict(Zip(a[::2], a[1::2]))

Si a est grand, vous voudrez probablement faire quelque chose comme ce qui suit, qui ne fait aucune liste temporaire comme celle-ci.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

Dans Python 3, vous pouvez également utiliser une compréhension dictée, mais ironiquement, je pense que le moyen le plus simple de le faire consiste à utiliser range() et len(), ce qui serait normalement une odeur de code.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

Donc, la méthode iter()/izip() est toujours probablement la plus pythonique de Python 3, bien que, comme le note EOL dans un commentaire, Zip() soit déjà fainéant dans Python 3 vous n'avez pas besoin de izip().

i = iter(a)
b = dict(Zip(i, i))

Si vous le voulez sur une ligne, vous devrez tricher et utiliser un point-virgule. ;-)

248
kindall

Réponse simple

Une autre option (avec la permission de Alex Martelli https://stackoverflow.com/a/2597178/104264 ):

dict(x[i:i+2] for i in range(0, len(x), 2))


Note connexe

Si vous avez ceci:

a = ['bi','double','duo','two']

et vous voulez ceci (chaque élément de la liste saisissant une valeur donnée (2 dans ce cas)):

{'bi':2,'double':2,'duo':2,'two':2}

vous pouvez utiliser:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
48
JobJob

Vous pouvez utiliser une compréhension de dict pour cela assez facilement:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

Ceci est équivalent à la boucle for ci-dessous:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]
16
Chris Arena

Quelque chose que je trouve assez cool, c'est que si votre liste ne contient que 2 éléments:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

Rappelez-vous que dict accepte toute itérable contenant une itérable, chaque élément de cette dernière devant être lui-même un itérable avec exactement deux objets.

10
rix

Peut-être pas le plus pythonique, mais

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
4
sahhhm

Vous pouvez le faire assez rapidement sans créer de tableaux supplémentaires, donc cela fonctionnera même pour les très grands tableaux:

dict(izip(*([iter(a)]*2)))

Si vous avez un générateur a, c'est encore mieux:

dict(izip(*([a]*2)))

Voici le récapitulatif:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a Tuple
dict()     #puts the tuples into key,value of the dictionary
4
topkara

Vous pouvez aussi le faire comme ceci (chaîne pour lister la conversion ici, puis conversion en dictionnaire)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(Zip(string_list[::2],string_list[1::2]))

    print string_list
1
Stefan Gruenwald

Je suis également très intéressé par un one-liner pour cette conversion, dans la mesure où une telle liste est l'initialiseur par défaut pour le hachage en Perl.

Une réponse exceptionnellement complète est donnée dans ce fil -

Le mien un, je suis débutant en Python), en utilisant Python 2.7 Generator Expressions , serait:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

1
Oleksiy

essayez ci-dessous le code:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}
0
muhammed

Vous pouvez également essayer cette approche en enregistrant les clés et les valeurs dans une liste différente, puis en utilisant la méthode dict.

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(Zip(keys,values)))

sortie:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}
0
Aaditya Ura
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}
0
Mahdi Ghelichi

Je ne sais pas s'il s'agit de Pythonic, mais semble fonctionner

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(Zip(key_list,value_list))
0
Manu