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.

Muhd
la source

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())
jamylak
la source
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']
Vlad Bezden
la source
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
Ronald Luc
la source
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))))
Mohan. UNE
la source
-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.

Raja jain
la source