Dict'ten değer listesini nasıl alabilirim?


338

Python'da bir dikte içindeki değerlerin listesini nasıl alabilirim?

Java'da, bir Haritanın değerlerini Liste olarak almak, yapmak kadar kolaydır list = map.values();. Bir dikteden değerlerin bir listesini almak için Python'da benzer basit bir yol olup olmadığını merak ediyorum.

Yanıtlar:


494

Evet, Python 2'deki ile aynı şey :

d.values()

In Python 3 (burada dict.valuesbir döndüren bir görünüm yerine Sözlüğün değerler):

list(d.values())

3
@Muhd Python belgeleri her şeye sahiptir: docs.python.org/2/library/stdtypes.html
jamylak

16
veya alternatif [d[k] for k in d]olarak hem python2.x hem de 3.x için çalışır ( Lütfen tavsiye edin, aslında bunu kullanmanızı önermiyorum ). Genellikle aslında bir değer listesine ihtiyacınız yoktur , bu yüzden d.values()gayet iyi.
mgilson

2
Biraz daha iyi bir bağlantı (yayınladığınız sayfadaki belirli bir noktaya): docs.python.org/2/library/stdtypes.html#dict.values
mgilson

1
Veya d.itervalues()sözlük değerlerinin yineleyicisini döndürmek ve bir listeden kaçınmak için.
101

@figs Soru "değerler listesi" dir, ancak evet, Python 2'de bir sözlük yineliyorsanız kesinlikle kullanın d.itervalues()ve çoğu durumda sadece yinelemeniz gerekir ve bir listeye ihtiyacınız olmaz.
jamylak

25

Dict_values ​​paketini açmak için * operatörünü kullanabilirsiniz :

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

veya liste nesnesi

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

Güzel bir çözüm, bunu anahtarlarla yapabileceğinizi biliyordum, ancak değerlerle değil, bilmek iyi: D
Timbus Calin

Yeni serin kullanım* operator
Jamylak

19

Bunu yapmanın tek ve tercihen tek bir yolu olmalı.

Dolayısıyla list(dictionary.values())olduğunu tek yön .

Python3 göz önüne alındığında, daha hızlı olan nedir?

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

1.90GHz'de Intel (R) Core (TM) i7-8650U CPU'da yapılmıştır.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

Sonuç

  1. Küçük sözlükler * operatoriçin daha hızlı
  2. Önemli list()olduğu büyük sözlükler için belki biraz daha hızlı

1
list(L), çünkü "Bunu yapmanın bir ve tercihen tek bir yolu olmalı."
Ufos

1
Önerildiği gibi değiştirildi, @Ufos
Ronald Luc

3

Aşağıdaki örneği izleyin -

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

Tamamen görsel amaçlı. Yararlı bir ürün üretmez ... Yalnızca uzun bir sözlüğün paragraf türü biçiminde yazdırılmasını istiyorsanız yararlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.