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') ]
>>> 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
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')]
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.
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)
Ce que vous voulez, ce sont les méthodes dict
items()
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')]
>>>
[(k,v) for (k,v) in d.iteritems()]
et
[(v,k) for (k,v) in d.iteritems()]
>>> 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') ]
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')]
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
k = (i,d[i])
list.append(k)
print list
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