Bagaimana saya bisa mendapatkan daftar nilai dari dict?

338

Bagaimana saya bisa mendapatkan daftar nilai dalam dict di Python?

Di Jawa, mendapatkan nilai-nilai Peta sebagai Daftar semudah melakukannya list = map.values();. Saya bertanya-tanya apakah ada cara sederhana yang serupa di Python untuk mendapatkan daftar nilai dari dict.

Muhd
sumber

Jawaban:

494

Ya itu hal yang persis sama di Python 2 :

d.values()

Dalam Python 3 ( sebagai gantinya dict.valuesmengembalikan tampilan nilai kamus):

list(d.values())
jamylak
sumber
3
@Muhd Dokumen Python selalu memiliki segalanya: docs.python.org/2/library/stdtypes.html
jamylak
16
atau, sebagai alternatif [d[k] for k in d]yang berfungsi untuk python2.x dan 3.x ( Harap diperhatikan, saya tidak menyarankan Anda menggunakan ini ). Biasanya Anda tidak benar-benar membutuhkan daftar nilai jadi d.values()tidak apa-apa.
mgilson
2
Tautan yang sedikit "lebih baik" (ke tempat tertentu di halaman yang Anda posting): docs.python.org/2/library/stdtypes.html#dict.values
mgilson
1
Atau d.itervalues()untuk mengembalikan daftar nilai kamus dan menghindari daftar.
101
@ gambar Pertanyaannya adalah "daftar nilai" tapi ya, jika Anda iterasi kamus di Python 2 pasti menggunakan d.itervalues()dan dalam kebanyakan kasus Anda hanya perlu mengulang dan tidak perlu daftar.
jamylak
25

Anda dapat menggunakan * operator untuk membuka paket nilai dict_values:

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

atau daftar objek

>>> d = {1: "a", 2: "b"}
>>> list(d.values())
['a', 'b']
Vlad Bezden
sumber
Solusi yang bagus, saya tahu Anda bisa melakukan ini dengan kunci tetapi tidak dengan nilai-nilai, baik untuk diketahui: D
Timbus Calin
Penggunaan baru keren* operator
jamylak
19

Seharusnya ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya.

Karena itu list(dictionary.values())adalah satu jalan .

Namun, mengingat Python3, apa yang lebih cepat?

[*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)

Dilakukan pada Intel (R) Core (TM) i7-8650U CPU @ 1.90GHz.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

Hasil

  1. Untuk kamus kecil * operatorlebih cepat
  2. Untuk kamus besar yang penting list()mungkin sedikit lebih cepat
Ronald Luc
sumber
1
list(L), cuz "Seharusnya ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya."
Ufos
1
Diubah sesuai usulan, @Ufos
Ronald Luc
3

Ikuti contoh di bawah ini -

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. SEBUAH
sumber
-3
out: dict_values([{1:a, 2:b}])

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

Murni untuk tujuan visual. Tidak menghasilkan produk yang bermanfaat ... Hanya berguna jika Anda ingin kamus panjang dicetak dalam bentuk jenis paragraf.

Raja jain
sumber