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

219

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') ]
Mike
la source
7
[tuple(reversed(x)) for x in d.items()]
garej
1
@garej: Étant donné que xc'est déjà un tupledans votre code (c'est la nature de itemsproduire un itérable de tuples), il serait plus simple / plus rapide de le faire [x[::-1] for x in d.items()]; la tranche d'inversion construit directement un inversé tuplede la taille appropriée plutôt que d'avoir le tupleconstructeur à remplir de manière itérative (avec surutilisation et redimensionnement à la fin) a à tuplepartir d'un reverseditérateur.
ShadowRanger
@ShadowRanger, vous avez raison. Je voulais juste être explicite sur le fait que ce n'est pas toujours un besoin de k, vmodèle dans de tels cas.
garej
Remarque:compatibility balise ajoutée en raison des différences py2.x // py3.x
dreftymac

Réponses:

360
>>> 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 mecs n'ont de toute façon aucun ordre spécifique. 1 Triez-le ou organisez-le si nécessaire.

Voir: items () , iteritems ()


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

1: La préservation de l'ordre d'insertion des dict a été ajoutée dans Python 3.7

Devin Jeanpierre
la source
8
items () retourne une vue dict_keys en python3. Enveloppez cet appel avec un cast dans une liste "list ()". Voir la réponse de @ SilentGhost
Erich
55

puisque personne d'autre ne l'a fait, j'ajouterai des versions 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')]
SilentGhost
la source
18

Vous pouvez utiliser des listes de compréhension.

[(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 listes de compréhension si vous le souhaitez, il est très intéressant de savoir ce que vous pouvez en faire.

mpeterson
la source
10

Créer une liste de couples nommés

Il peut souvent être très pratique d'utiliser namedtuple . Par exemple, vous avez un dictionnaire de «nom» comme clés et de «score» comme valeurs comme:

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

Vous pouvez lister les éléments sous forme de tuples, 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 comme ceci:

>>> player = best[0]

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

Comment procéder:

liste dans un ordre aléatoire ou en gardant l'ordre des collections .

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)
Rémi
la source
7

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

et

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
la source
7
"[(k, v) pour (k, v) dans d.iteritems ()]" est un terrible équivalent de d.items ()
Devin Jeanpierre
5

Ce sont les changements de rupture de Python 3.x et Python 2.x

Pour Python3.x, utilisez

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

Pour Python 2.7, utilisez

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
la source
4
>>> 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')]
ismail
la source
4

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

zip renverra une liste de tuples qui agit 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')]
Vivek Sable
la source
Cela a fonctionné pour moi comme une alternative à collections.OrderedDict()celle qui fonctionne mieux avec plusieurs versions de la bibliothèque de requêtes HTTP Python. Même si je n'aime pas le zipnom de la fonction comme étant quelque peu vague / surchargé.
MarkHu
Notez que zip-ification n'est pas un casting "profond", c'est-à-dire que s'il y a des enfants imbriqués, ils ne seront pas affectés. Vous devrez peut-être lancer votre propre récursivité.
MarkHu
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Harish
la source
2
Bien que ce code puisse aider à résoudre le problème, il n'explique pas pourquoi et / ou comment il répond à la question. Fournir ce contexte supplémentaire améliorerait considérablement sa valeur éducative à long terme. Veuillez modifier votre réponse pour ajouter des explications, y compris les limitations et hypothèses applicables.
Toby Speight
3

Un plus simple serait

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Le second n'est pas plus simple mais oui.

Ketan
la source