268 votes

Comment puis-je convertir un dictionnaire Python à une liste de tuples ?

Si j’ai un dictionnaire comme :

Comment puis-je convertir à cela ?

Et comment puis-je convertir à cela ?

423voto

Devin Jeanpierre Points 23162
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

Il n'est pas dans l'ordre que vous voulez, mais dicts ne disposent pas d'un ordre de toute façon. De les trier ou de les organiser en tant que de besoin.

Voir: articles(), iteritems()


En Python 3.x, vous ne devez pas utiliser iteritems (qui n'existe plus), mais au lieu d'utiliser items, ce qui renvoie maintenant une "vue" dans le dictionnaire d'objets. Voir Ce qui est Nouveau document pour Python 3.0, et la nouvelle de la documentation sur les points de vue.

68voto

SilentGhost Points 79627

puisque personne d’autre ne l’a fait, je vais ajouter les versions py3k :

20voto

mpeterson Points 551

Vous pouvez utiliser des compréhensions de liste.

vous obtiendrez [(« a », 1), (« b », 2), (« c », 3)] et

l’autre exemple.

En savoir plus sur les compréhensions de liste si vous le souhaitez, il est très intéressant ce que vous pouvez faire avec eux.

10voto

Remi Points 4223

Note: 2 ans de retard, donc s'il vous plaît voter moi si vous aimez cette suggestion :) ...


Créer une liste de namedtuples

Il peut souvent être très pratique à utiliser namedtuple. Par exemple, vous avez un dictionnaire de 'nom' que les clés et le "score" que des valeurs telles que:

d = {'John':5, 'Alex':10, 'Richard': 7}

Vous pouvez lister les éléments de n-uplets, triés si vous le souhaitez, et d'obtenir le nom et le score de, disons que le joueur avec le score le plus élevé (indice=0) très Pythonically comme ceci:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Comment faire:

liste dans un ordre aléatoire ou de maintien de l'ordre de collections.OrderedDict:

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

dans l'ordre, triés par valeur ("score"):

import collections
Player = collections.namedtuple('Player', 'score name')

triés avec le score le plus bas en premier:

worst = sorted(Player(v,k) for (k,v) in d.items())

triés avec le score le plus élevé en premier:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7voto

Barry Wark Points 73462

Ce que vous voulez est - dicts' items() et iteritems() méthodes. items renvoie une liste de (clé,valeur) des n-uplets. Depuis les tuples sont immuables, ils ne peuvent pas être inversés. Ainsi, vous devez parcourir les éléments et de créer de nouveaux tuples pour obtenir l'inversion de l' (valeur,clé) de n-uplets. Pour l'itération, iteritems est préférable, car il utilise un générateur pour produire de l' (clé,valeur) des n-uplets plutôt que d'avoir à garder l'ensemble de la liste en mémoire.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>>

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