dict에서 값 목록을 얻으려면 어떻게해야합니까?


338

파이썬에서 dict의 값 목록을 어떻게 얻을 수 있습니까?

Java에서는 Map의 값을 List로 얻는 것이 수행하는 것만 큼 쉽습니다 list = map.values();. 파이썬에서 dict에서 값 목록을 얻는 비슷한 방법이 있는지 궁금합니다.

답변:


494

예. 파이썬 2 에서도 똑같습니다 .

d.values()

에서 파이썬 3 (여기서 dict.values반환 보기 대신 사전의 값을) :

list(d.values())

3
@Muhd 파이썬 문서는 항상 모든 것을 가지고 있습니다 : docs.python.org/2/library/stdtypes.html
jamylak

16
또는 [d[k] for k in d]python2.x와 3.x에서 모두 작동합니다 ( 실제로 이것을 사용하도록 제안하지는 않습니다 ). 일반적으로 실제로 값 목록이 필요 하지 않으므로 d.values()괜찮습니다.
mgilson

2
게시 한 페이지의 특정 지점으로 약간 "더 나은"링크 : docs.python.org/2/library/stdtypes.html#dict.values
mgilson

1
또는 d.itervalues()사전 값의 반복자를 리턴하고 목록을 피하기 위해.
101

@figs 문제는 "값 목록"이지만 그렇습니다. 파이썬 2에서 사전을 반복해서 사용 d.itervalues()한다면 대부분의 경우 반복하고 목록이 필요하지 않습니다.
jamylak

25

* 연산자 를 사용 하여 dict_values의 압축을 풀 수 있습니다 .

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

또는 목록 객체

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

좋은 해결책, 나는 당신이 키로 이것을 할 수는 있지만 값으로는 할 수 없다는 것을 알았습니다. :
Timbus Calin

* operator
jamylak

19

그것을하는 하나의 ‒, 바람직하게는 오직 하나의 ‒ 확실한 방법이 있어야합니다.

따라서 list(dictionary.values())는 IS 하나의 방법 .

그러나 Python3을 고려할 때 무엇이 ​​더 빠릅니까?

[*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 @ Intel (R) Core i7-8650U CPU에서 완료되었습니다.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

결과

  1. 작은 사전 * operator은 빠릅니다
  2. 중요한 사전의 경우 list()약간 빠를 수 있습니다.

1
list(L), cuz "그것을하는 확실한 방법이 하나 있어야합니다."
Ufos

1
제안 @Ufos로 변경
로널드 뤽

3

아래 예제를 따르십시오-

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

시각적 인 목적으로 만 사용하십시오. 유용한 제품을 생산하지 않습니다 ... 긴 사전을 단락 유형 양식으로 인쇄하려는 경우에만 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.