Python Language Comprensioni del dizionario


Esempio

Una comprensione del dizionario è simile alla comprensione di una lista, tranne per il fatto che produce un oggetto dizionario invece di una lista.

Un esempio di base:

Python 2.x 2.7
{x: x * x for x in (1, 2, 3, 4)}
# Out: {1: 1, 2: 4, 3: 9, 4: 16}

che è solo un altro modo di scrivere:

dict((x, x * x) for x in (1, 2, 3, 4))
# Out: {1: 1, 2: 4, 3: 9, 4: 16}

Come per la comprensione di una lista, possiamo usare una dichiarazione condizionale all'interno della comprensione del ditt per produrre solo gli elementi dict che soddisfano qualche criterio.

Python 2.x 2.7
{name: len(name) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6}  
# Out: {'Exchange': 8, 'Overflow': 8}

Oppure, riscritto usando un'espressione di generatore.

dict((name, len(name)) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6)
# Out: {'Exchange': 8, 'Overflow': 8}

A partire da un dizionario e usando la comprensione del dizionario come filtro della coppia chiave-valore

Python 2.x 2.7
initial_dict = {'x': 1, 'y': 2}
{key: value for key, value in initial_dict.items() if key == 'x'}
# Out: {'x': 1}

Commutazione chiave e valore del dizionario (dizionario invertito)

Se hai un dict contenente semplici valori hashable (i valori duplicati potrebbero avere risultati imprevisti):

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

e volevi scambiare le chiavi e i valori, puoi adottare diversi approcci a seconda del tuo stile di codifica:

  • swapped = {v: k for k, v in my_dict.items()}
  • swapped = dict((v, k) for k, v in my_dict.iteritems())
  • swapped = dict(zip(my_dict.values(), my_dict))
  • swapped = dict(zip(my_dict.values(), my_dict.keys()))
  • swapped = dict(map(reversed, my_dict.items()))
print(swapped)
# Out: {a: 1, b: 2, c: 3}
Python 2.x 2.3

Se il tuo dizionario è grande, considera l' importazione di itertools e utilizza izip o imap .


Unione di dizionari

Combina dizionari e opzionalmente sostituisci i vecchi valori con una comprensione del dizionario annidata.

dict1 = {'w': 1, 'x': 1}
dict2 = {'x': 2, 'y': 2, 'z': 2}

{k: v for d in [dict1, dict2] for k, v in d.items()}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}

Tuttavia, il disimballaggio del dizionario ( PEP 448 ) potrebbe essere preferito.

Python 3.x 3.5
{**dict1, **dict2}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}

Nota : le comprensibilità del dizionario sono state aggiunte in Python 3.0 e supportate a 2.7+, a differenza delle list comprehensions, che sono state aggiunte in 2.0. Le versioni <2.7 possono usare le espressioni del generatore e il dict() incorporato per simulare il comportamento delle comprensioni del dizionario.