Comment puis-je obtenir la liste des valeurs de dict?


338

Comment puis-je obtenir une liste des valeurs d'un dict en Python?

En Java, obtenir les valeurs d'une carte en tant que liste est aussi simple que de le faire list = map.values();. Je me demande s'il existe un moyen simple et similaire en Python pour obtenir une liste de valeurs à partir d'un dict.

Réponses:


495

Oui, c'est exactement la même chose en Python 2 :

d.values()

En Python 3 (où dict.valuesrenvoie à la place une vue des valeurs du dictionnaire):

list(d.values())

3
@Muhd Les documents Python ont toujours tout: docs.python.org/2/library/stdtypes.html
jamylak

16
ou, alternativement, [d[k] for k in d]qui fonctionne à la fois pour python2.x et 3.x ( veuillez noter que je ne suggère pas réellement que vous l'utilisiez ). Habituellement, vous n'avez pas vraiment besoin d' une liste de valeurs, donc d.values()c'est très bien.
mgilson

2
Un lien légèrement "meilleur" (vers un endroit spécifique sur la page que vous avez publiée): docs.python.org/2/library/stdtypes.html#dict.values
mgilson

1
Ou d.itervalues()pour renvoyer un itérateur de valeurs de dictionnaire et éviter une liste.
101

@figs La question est "liste de valeurs" mais oui, si vous itériez un dictionnaire sur Python 2, utilisez-le d.itervalues()et dans la plupart des cas, vous n'aurez qu'à itérer et vous n'aurez pas besoin d'une liste.
jamylak

25

Vous pouvez utiliser l' opérateur * pour décompresser dict_values:

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

ou liste d'objets

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

Belle solution, je savais que vous pouviez le faire avec des clés mais pas avec des valeurs, bon à savoir: D
Timbus Calin

Nouvelle utilisation cool de* operator
jamylak

19

Il devrait y avoir une - et de préférence une seule - manière évidente de le faire.

C'est donc list(dictionary.values())la seule façon .

Pourtant, en considérant Python3, qu'est-ce qui est plus rapide?

[*L]vs [].extend(L)vslist(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)

Fait sur un processeur Intel (R) Core (TM) i7-8650U à 1,90 GHz.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

Le résultat

  1. Pour les petits dictionnaires, * operatorc'est plus rapide
  2. Pour les gros dictionnaires où c'est important, list()c'est peut-être un peu plus rapide

1
list(L), cuz "Il devrait y avoir une - et de préférence une seule - façon évidente de le faire."
Ufos

1
Modifié comme proposé, @Ufos
Ronald Luc

3

Suivez l'exemple ci-dessous -

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

Purement à des fins visuelles. Ne produit pas de produit utile ... Utile uniquement si vous voulez qu'un long dictionnaire s'imprime sous forme de type de paragraphe.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.