web-dev-qa-db-fra.com

Comment puis-je convertir un dictionnaire en une liste de n-uplets?

Si j'ai un dictionnaire comme:

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

Comment puis-je le convertir en cela?

[ ('a', 1), ('b', 2), ('c', 3) ]

Et comment puis-je le convertir en cela?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
193
mike
>>> 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')]

Ce n'est pas dans l'ordre que vous voulez, mais les dict n'ont de toute façon pas d'ordre spécifique.1 Triez-le ou organisez-le si nécessaire.

Voir: items () , iteritems ()


Dans Python 3.x, vous n'utiliseriez pas iteritems (qui n'existe plus), mais plutôt items, qui renvoie désormais une "vue" dans les éléments du dictionnaire. Voir le Quoi de neuf document pour Python 3.0 et le nouveau documentation sur les vues .

1: La préservation de l'ordre d'insertion pour les dict était ajoutée dans Python 3.7

335
Devin Jeanpierre

comme personne d'autre ne l'a fait, j'ajouterai les versions de py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]
48
SilentGhost

Vous pouvez utiliser les compréhensions de liste.

[(k,v) for k,v in a.iteritems()] 

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

[(v,k) for k,v in a.iteritems()] 

l'autre exemple.

En savoir plus sur les compréhensions de liste si vous aimez, c'est très intéressant ce que vous pouvez en faire.

18
mpeterson

Créer une liste de nommés

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

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

Vous pouvez lister les éléments sous forme de n-uplets, triés si vous le souhaitez, et obtenir le nom et le score de, disons le joueur avec le score le plus élevé (index = 0) très pythoniquement semblable à ceci:

>>> player = best[0]

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

Comment faire ceci:

liste dans un ordre aléatoire ou en gardant 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é avec le score le plus bas en premier:

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

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

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

Ce que vous voulez, ce sont les méthodes dictitems() et iteritems(). items renvoie une liste de tuples (clé, valeur). Les n-uplets étant immuables, ils ne peuvent pas être inversés. Ainsi, vous devez itérer les éléments et créer de nouveaux nuplets pour obtenir les nuplets inversés (valeur, clé). Pour l'itération, iteritems est préférable car il utilise un générateur pour produire les n-uplets (clé, valeur) plutôt que de devoir conserver la liste complète 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')]
>>> 
7
Barry Wark
[(k,v) for (k,v) in d.iteritems()]

et

[(v,k) for (k,v) in d.iteritems()]
6
Robert Rossney
 >>> a = {'a': 1, 'b': 2, 'c': 3} 
 
 >>> [(x, a [x] ) pour x dans a.keys ()] 
 [('a', 1), ('c', 3), ('b', 2)] 
 
 >>> [(a [x], x) pour x dans a.keys ()] 
 [(1, 'a'), (3, 'c'), (2, 'b') ] 
4
ismail

Par keys() et values() méthodes de dictionnaire et Zip.

Zip retournera une liste de n-uplets agissant comme un dictionnaire ordonné.

démo:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> Zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> Zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]
4
Vivek Sable
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
3
Harish

Pour Python3.x, utilisez

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

Pour Python 2.7, utilisez

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

Merci

3
Tessaracter