261 votes

Convertir un dictionnaire en liste ?

J'essaie de convertir un dictionnaire Python en une liste Python, afin d'effectuer certains calculs.

#My dictionary
dict = {}
dict['Capital']="London"
dict['Food']="Fish&Chips"
dict['2012']="Olympics"

#lists
temp = []
dictList = []

#My attempt:
for key, value in dict.iteritems():
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp) 
    aKey = ""
    aValue = ""

C'est ce que j'ai essayé de faire... mais je n'arrive pas à comprendre ce qui ne va pas ?

5 votes

sum(dict.items(), ())

22 votes

Notez que dans Python 3, dict.items() dict.keys() et dict.values() renvoie un Dictionary object qui, ne supportant pas l'indexation, n'est pas une vraie liste. Une liste réelle peut être obtenue par list(dict.values()) .

535voto

Björn Points 15485
dict.items()

Fait l'affaire.

22 votes

Je savais qu'il y aurait une façon pythonique ridicule de faire ça, merci beaucoup. Je trouve juste la documentation de Python plutôt difficile à lire !

1 votes

Vous pouvez toujours utiliser aide(dict) sur la ligne de commande Python et remplacez dict avec l'objet en question pour voir une liste de ses méthodes d'aide, etc. items(...) D.items() -> liste des paires (clé, valeur) de D, sous forme de 2-tuples

34 votes

Il veut une liste plate, items() produit une liste de tuples.

247voto

Akseli Palén Points 7697

Conversion de dict à la liste est rendu facile en Python. Trois exemples :

>> d = {'a': 'Arthur', 'b': 'Belling'}

>> d.items()
[('a', 'Arthur'), ('b', 'Belling')]

>> d.keys()
['a', 'b']

>> d.values()
['Arthur', 'Belling']

0 votes

Est-il possible de spécifier l'ordre des values() ? L'ordre des valeurs d'une dictée standard est-il même défini ?

2 votes

@MichaelScheper L'ordre de la dictée standard n'est pas spécifié et l'ordre des valeurs peut être différent de l'ordre d'insertion. Cependant, on pourrait trier les listes ci-dessus ou utiliser OrderedDict (voir le premier lien).

13 votes

Il semble que dans Python3, vous devez utiliser list(d.items()), list(d.keys()) et list(d.values()).

176voto

Dave Webb Points 90034

Votre problème est que vous avez key et value entre guillemets, ce qui en fait des chaînes de caractères, c'est-à-dire que vous placez aKey pour contenir la chaîne de caractères "key" et non la valeur de la variable key . De plus, vous n'effacez pas le temp de sorte que vous l'enrichissez à chaque fois, au lieu de n'avoir que deux éléments dans la liste.

Pour corriger votre code, essayez quelque chose comme :

for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

Vous n'avez pas besoin de copier les variables de la boucle key et value dans une autre variable avant de les utiliser, alors je les ai supprimés. De même, il n'est pas nécessaire d'utiliser append pour construire une liste, il suffit de le spécifier entre crochets comme indiqué ci-dessus. Et nous aurions pu faire dictlist.append([key,value]) si nous voulions être aussi brefs que possible.

Ou utilisez simplement dict.items() comme cela a été suggéré.

3 votes

Réponse correcte grâce à l'explication de ce que je faisais mal. Comme vous pouvez le constater, je suis assez novice en matière de Python et toute explication est la bienvenue. A la vôtre !

2 votes

Si vous utilisez des listes d'appendices comme cela, vous produisez une liste de listes. Ce qu'il voulait était une liste plate, pour laquelle vous utiliseriez extend() comme dans la réponse de Shay.

2 votes

Il n'a jamais dit ça, Ajith. Une liste de listes est une liste python valide, et une bien meilleure interprétation d'un "dictionnaire" qu'une liste plate contenant uniquement des valeurs non-listes. Une liste de listes est au moins capable de montrer des clés et des valeurs toujours groupées.

70voto

Shay Points 334

Vous devez utiliser dict.items() .

Voici une solution unique pour votre problème :

[(k,v) for k,v in dict.items()]

et le résultat :

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')]

ou vous pouvez faire

l=[]
[l.extend([k,v]) for k,v in dict.items()]

pour :

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London']

2 votes

Dans python 2.6, au moins, vous n'avez pas besoin de dict.items() : [(k,v) for k,v in dict] .

2 votes

Python3.6 - [x for x in dict.items()] fait la même chose.

5 votes

Ou simplement list(dict.items())

45voto

Martin DeMello Points 4811
 >>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'}
 >>> list(reduce(lambda x, y: x + y, a.items()))
 ['foo', 'bar', 'baz', 'quux', 'hello', 'world']

Pour expliquer : a.items() renvoie une liste de tuples. L'addition de deux tuples donne un tuple contenant tous les éléments. Ainsi, la réduction crée un tuple contenant toutes les clés et valeurs, puis la fonction list(...) en fait une liste.

0 votes

Intéressant... Il pourrait y avoir une utilité pour ce genre de fusion quelque part.

8 votes

Pour python 3.^ au lieu d'utiliser reduce, utilisez functools.reduce

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X