tupla pitone da dettare


149

Per la tupla, t = ((1, 'a'),(2, 'b')) dict(t)ritorna{1: 'a', 2: 'b'}

C'è un buon modo per ottenere {'a': 1, 'b': 2}(scambio di chiavi e valori)?

Alla fine, voglio poter tornare 1dato 'a'o 2dato 'b', forse convertirsi in un dict non è il modo migliore.

Risposte:


277

Provare:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 Bellissimo !, ho dovuto provarlo con zip dict(zip(*zip(*t)[::-1])). Questo è più lento, più brutto e utilizza molta più memoria ... probabilmente 3x.
kevpie,

@kevpie La cosa meravigliosa di Python è che ci sono centinaia di modi per esprimere come fare qualcosa, ognuno altrettanto interessante del prossimo.
bjd2385,

Fantastico, se quello che hai è una tripla puoi fare: dict((x, y) for x, y, z in t)o dict((x, (y, z)) for x, y, z in t)ottenere il secondo e il terzo valore come tupla.
Guiva

Molto veloce, completo e semplice. Risposta perfetta
gies0r

73

Un metodo leggermente più semplice:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
cosa lo rende più veloce?
Maazza,

9
Le funzioni map e dict sono implementate in C e sono molto più veloci di qualsiasi versione di Python
jterrace

1
Mi piace questo per avere reverseesplicitamente spiegato.
Frerich Raabe,

4
@maazza: in generale, i test delle prestazioni suggeriscono che (almeno nell'implementazione in C) mapè più veloce di una comprensione quando la cosa da mappare è un'altra funzione incorporata (come reversed); nella maggior parte degli altri casi, è vero il contrario. Ma è meglio profilare che indovinare :)
Karl Knechtel,

43

Ancora più conciso se sei su Python 2.7:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}

9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

O:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

Non vedo come questa risposta alla domanda di OP
Luca Amerio,

4

Se esistono più valori per la stessa chiave, il codice seguente aggiungerà quei valori a un elenco corrispondente alla loro chiave,

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

Ecco un paio di modi per farlo:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.