ฉันจะรับรายการค่าจาก dict ได้อย่างไร


338

ฉันจะรับรายการค่าใน dict ใน Python ได้อย่างไร

ใน Java list = map.values();ได้รับค่าของแผนที่เป็นรายการเป็นเรื่องง่ายเหมือนการทำ ฉันสงสัยว่ามีวิธีง่ายๆใน Python ที่จะได้รับรายการค่าจาก dict หรือไม่

คำตอบ:


494

ใช่มันเป็นสิ่งเดียวกันในPython 2 :

d.values()

ในPython 3 (โดยที่dict.valuesคืนค่ามุมมองของค่าพจนานุกรมแทน):

list(d.values())

3
@Muhd เอกสาร Python มีทุกสิ่งเสมอ: 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 คำถามคือ "รายการค่า" แต่ใช่ถ้าคุณทำซ้ำพจนานุกรมใน Python 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']

วิธีแก้ปัญหาที่ดีฉันรู้ว่าคุณสามารถทำได้ด้วยปุ่ม แต่ไม่ได้มีค่าควรรู้: D
Timbus Calin

ใช้ใหม่จาก* operator
jamylak

19

ควรมีวิธีที่ชัดเจนและชัดเจนเพียงวิธีเดียวเท่านั้น

ดังนั้นจึงlist(dictionary.values())เป็นวิธีหนึ่ง

กระนั้นการพิจารณา Python3 นั้นเร็วกว่าอะไร?

[*L]เทียบ[].extend(L)กับ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)

ทำบน Intel (R) Core (TM) i7-8650U CPU @ 1.90GHz

# Name                    Version                   Build
ipython                   7.5.0            py37h24bf2e0_0

ผลลัพธ์

  1. สำหรับพจนานุกรมขนาดเล็ก* operatorนั้นเร็วกว่า
  2. สำหรับพจนานุกรมขนาดใหญ่ที่มีความสำคัญlist()อาจจะเร็วกว่าเล็กน้อย

1
list(L)ควรมีวิธีเดียวที่ชัดเจนกว่าวิธีหนึ่ง ".
ยูเอฟโอ

1
เปลี่ยนเป็นข้อเสนอ @Ufos
Ronald Luc

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.