Làm thế nào tôi có thể nhận được danh sách các giá trị từ dict?


337

Làm cách nào tôi có thể nhận được danh sách các giá trị trong một dict trong Python?

Trong Java, việc lấy các giá trị của Bản đồ dưới dạng Danh sách cũng dễ như thực hiện list = map.values();. Tôi tự hỏi liệu có một cách đơn giản tương tự trong Python để có được danh sách các giá trị từ một lệnh.

Câu trả lời:


493

Vâng, đó chính là điều tương tự trong Python 2 :

d.values()

Trong Python 3 (nơi dict.valuestrả về chế độ xem các giá trị của từ điển thay thế):

list(d.values())

3
@Muhd Các Python docs luôn có mọi thứ: docs.python.org/2/library/stdtypes.html
jamylak

16
hoặc, thay vào [d[k] for k in d]đó, hoạt động cho cả python2.x và 3.x ( Xin lưu ý, tôi không thực sự khuyên bạn nên sử dụng cái này ). Thông thường bạn không thực sự cần một danh sách các giá trị như vậy d.values()là tốt.
mgilson

2
Một liên kết hơi "tốt hơn" (đến một nơi cụ trên trang mà bạn đăng tải): docs.python.org/2/library/stdtypes.html#dict.values
mgilson

1
Hoặc d.itervalues()để trả về một vòng lặp của các giá trị từ điển và tránh một danh sách.
101

@figs Câu hỏi là "danh sách các giá trị" nhưng có, nếu bạn đang lặp lại một từ điển trên Python 2 chắc chắn sử dụng d.itervalues()và trong hầu hết các trường hợp, bạn sẽ chỉ cần lặp lại và không cần một danh sách.
jamylak

25

Bạn có thể sử dụng toán tử * để giải nén dict_values:

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

hoặc liệt kê đối tượng

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

Giải pháp tuyệt vời, tôi biết bạn có thể làm điều này bằng các khóa nhưng không phải bằng các giá trị, điều tốt cần biết: D
Timbus Calin

Sử dụng mới tuyệt vời của* operator
jamylak

18

Nên có một - và tốt nhất là chỉ có một - cách rõ ràng để làm điều đó.

Do đó list(dictionary.values())một cách .

Tuy nhiên, xem xét Python3, cái gì nhanh hơn?

[*L]so [].extend(L)vớilist(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)

Thực hiện trên CPU Intel (R) Core (TM) i7-8650U @ 1.90GHz.

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

Kết quả

  1. Đối với từ điển nhỏ * operatorlà nhanh hơn
  2. Đối với các từ điển lớn, nơi nó quan trọng list()có thể nhanh hơn một chút

1
list(L), vì "Nên có một - và tốt nhất là chỉ có một - cách rõ ràng để làm điều đó."
Ufos

1
Thay đổi như đề xuất, @Ufos
Ronald Luc

3

Thực hiện theo ví dụ dưới đây -

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

Hoàn toàn cho mục đích trực quan. Không tạo ra một sản phẩm hữu ích ... Chỉ hữu ích nếu bạn muốn một từ điển dài để in ở dạng đoạn văn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.