Domanda

Se ho un dizionario come:

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

Come faccio a convertirlo in questo?

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

E come posso convertirlo in questo?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
È stato utile?

Soluzione

>>> 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')]

Non è nell'ordine che volete, ma dicts non hanno alcun ordine specifico comunque. 1 Ordina o organizzare, se necessario.

Si veda: articoli () , noreferrer iteritems ()


In Python 3.x, non si può usare iteritems (che non esiste più), ma invece utilizzare items, che ora restituisce una "vista" nelle voci del dizionario. Vedere le Cosa c'è di nuovo documento per Python 3.0, e la nuova documentazione rel="noreferrer"> .

1: la conservazione inserzione-ordine per dicts era aggiunto in Python 3.7

Altri suggerimenti

dato che nessun altro ha fatto, io aggiungo versioni 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')]

È possibile utilizzare list comprehension.

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

ti porterà [ ('a', 1), ('b', 2), ('c', 3) ] e

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

L'altro esempio.

Per saperne di più list comprehension se ti piace, è molto interessante cosa si può fare con loro.

Creare un elenco di namedtuples

Spesso può essere molto comodo da usare namedtuple . Ad esempio, si dispone di un dizionario di 'nome' come chiavi e 'punteggio' come valori come:

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

È possibile elencare gli elementi come tuple, scelte, se volete, e ottenere il nome e il punteggio di, diciamo che il giocatore con il punteggio più alto (indice = 0) molto Pythonically in questo modo:

>>> player = best[0]

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

Come fare questo:

lista in ordine casuale o ordine di collections.OrderedDict :

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

al fine, in ordine di valore ( 'punteggio'):

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

ordinato con punteggio più basso prima:

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

ordinato con punteggio più alto prima:

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

Quello che vuoi è 's dict items() e iteritems() metodi. items restituisce una lista di tuple (chiave, valore). Dal momento che le tuple sono immutabili, non possono essere invertiti. Pertanto, è necessario per iterare gli elementi e creare nuove tuple per ottenere le tuple (valore, chiave) invertiti. Per iterazione, iteritems è preferibile in quanto utilizza un generatore per produrre il (chiave, valore) tuple invece di dover mantenere l'intero elenco in memoria.

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()]

e

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

>>> [(x,a[x]) for x in a.keys() ]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a[x],x) for x in a.keys() ]
[(1, 'a'), (3, 'c'), (2, 'b')]

Per keys() e values() metodi di dizionario e zip.

<=> restituirà una lista di tuple, che agisce come un dizionario ordinato.

Demo:

>>> 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

Per uso Python3.x

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

Per Python 2.7 Condizioni

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

Grazie

scroll top