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.

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())

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']

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

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

-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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.