Come posso ottenere un elenco di valori da dict?


338

Come posso ottenere un elenco dei valori in un dict in Python?

In Java, ottenere i valori di una mappa come elenco è facile come fare list = map.values();. Mi chiedo se esiste un modo altrettanto semplice in Python per ottenere un elenco di valori da un dict.

Risposte:


494

Sì, è esattamente la stessa cosa in Python 2 :

d.values()

In Python 3 (dove dict.valuesrestituisce invece una vista dei valori del dizionario):

list(d.values())

3
@Muhd I documenti di Python hanno sempre tutto: docs.python.org/2/library/stdtypes.html
jamylak

16
o, in alternativa, [d[k] for k in d]che funziona sia per python2.x sia per 3.x (si prega di notare che in realtà non sto suggerendo di usarlo ). Di solito non è necessario un elenco di valori, quindi d.values()va bene.
mgilson,

2
Un link leggermente "migliore" (verso un punto specifico della pagina che hai pubblicato): docs.python.org/2/library/stdtypes.html#dict.values
mgilson

1
O d.itervalues()per restituire un iteratore di valori di dizionario ed evitare un elenco.
101

@figs La domanda è "elenco di valori" ma sì, se stavi iterando un dizionario su Python 2 sicuramente utilizzi d.itervalues()e nella maggior parte dei casi dovrai solo iterare e non avrai bisogno di un elenco.
jamylak,

25

È possibile utilizzare operatore * per dict_values decompressione:

>>> d = {1: "a", 2: "b"}
>>> [*d.values()]
['a', 'b']

o elenca l'oggetto

>>> d = {1: "a", 2: "b"}
>>> list(d.values())
['a', 'b']

Bella soluzione, sapevo che potevi farlo con le chiavi ma non con i valori, buono a sapersi: D
Timbus Calin

Fantastico nuovo uso di* operator
jamylak

19

Dovrebbe esserci un modo - e preferibilmente solo uno - ovvio per farlo.

Pertanto list(dictionary.values())è l' unico modo .

Tuttavia, considerando Python3, cosa è più veloce?

[*L]vs. [].extend(L)vs.list(L)

small_ds = {x: str(x+42) for x in range(10)}
small_df = {x: float(x+42) for x in range(10)}

print('Small Dict(str)')
%timeit [*small_ds.values()]
%timeit [].extend(small_ds.values())
%timeit list(small_ds.values())

print('Small Dict(float)')
%timeit [*small_df.values()]
%timeit [].extend(small_df.values())
%timeit list(small_df.values())

big_ds = {x: str(x+42) for x in range(1000000)}
big_df = {x: float(x+42) for x in range(1000000)}

print('Big Dict(str)')
%timeit [*big_ds.values()]
%timeit [].extend(big_ds.values())
%timeit list(big_ds.values())

print('Big Dict(float)')
%timeit [*big_df.values()]
%timeit [].extend(big_df.values())
%timeit list(big_df.values())
Small Dict(str)
256 ns ± 3.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
338 ns ± 0.807 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
336 ns ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Small Dict(float)
268 ns ± 0.297 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
343 ns ± 15.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
336 ns ± 0.68 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Big Dict(str)
17.5 ms ± 142 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.5 ms ± 338 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.2 ms ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Big Dict(float)
13.2 ms ± 41 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.1 ms ± 919 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
12.8 ms ± 578 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Fatto su CPU Intel (R) Core (TM) i7-8650U a 1,90 GHz.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

Il risultato

  1. Per i dizionari di piccole dimensioni * operatorè più veloce
  2. Per i grandi dizionari dove conta list()è forse leggermente più veloce

1
list(L), cuz "Dovrebbe esserci uno - e preferibilmente solo uno - modo ovvio per farlo."
Ufo

1
Modificato come proposto, @Ufos
Ronald Luc,

3

Segui l'esempio seguente -

songs = [
{"title": "happy birthday", "playcount": 4},
{"title": "AC/DC", "playcount": 2},
{"title": "Billie Jean", "playcount": 6},
{"title": "Human Touch", "playcount": 3}
]

print("====================")
print(f'Songs --> {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --> {title}')

playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --> {playcount}')
print (f'Print Sorted playcount --> {sorted(playcount)}')

# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))

-3
out: dict_values([{1:a, 2:b}])

in:  str(dict.values())[14:-3]    
out: 1:a, 2:b

A puro scopo visivo. Non produce un prodotto utile ... Utile solo se si desidera stampare un dizionario lungo in un tipo di paragrafo.

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.