ในรายการ Dicts ค้นหาค่า min () ของฟิลด์ Dict ทั่วไป


93

ฉันมีรายการพจนานุกรมดังนี้:

[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

ฉันต้องการค้นหาราคาขั้นต่ำ () และราคาสูงสุด () ตอนนี้ฉันสามารถจัดเรียงสิ่งนี้ได้ง่ายพอโดยใช้คีย์ที่มีนิพจน์แลมบ์ดา (ดังที่พบในบทความ SO อื่น) ดังนั้นหากไม่มีวิธีอื่นฉันก็ไม่ติดขัด อย่างไรก็ตามจากสิ่งที่ฉันเห็นมีทางตรงใน Python เกือบตลอดเวลาดังนั้นนี่จึงเป็นโอกาสที่ฉันจะได้เรียนรู้เพิ่มเติมอีกเล็กน้อย

คำตอบ:


60

มีหลายตัวเลือก นี่คือข้อความตรงไปตรงมา:

seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)

[แก้ไข]

หากคุณต้องการวนซ้ำรายการเพียงครั้งเดียวคุณสามารถลองสิ่งนี้ได้ (สมมติว่าค่าสามารถแสดงเป็นints ได้):

import sys

lo,hi = sys.maxint,-sys.maxint-1
for x in (item['the_key'] for item in dict_list):
    lo,hi = min(x,lo),max(x,hi)

ฉันยอมรับสิ่งนี้เป็นคำตอบเพราะไม่เพียง แต่ให้คำตอบเท่านั้น แต่ยังแสดงให้ฉันเห็นว่ามีลำดับนามธรรม Darn Python เป็นภาษาที่สวยงาม ขอบคุณ!
Hank Fay

2
หากคุณไม่ต้องการseqและรายการมีขนาดใหญ่อาจไม่มีประสิทธิภาพเนื่องจากต้องจัดสรรหน่วยความจำสำหรับรายการทั้งหมดเพียงเพื่อหาค่าสูงสุด
Charles L.

มันพ่นAttributeError: module 'sys' has no attribute 'maxint'
Suncatcher

239
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

maxPricedItem = max(lst, key=lambda x:x['price'])
minPricedItem = min(lst, key=lambda x:x['price'])

สิ่งนี้บอกคุณไม่เพียงว่าราคาสูงสุดคืออะไร แต่ยังรวมถึงรายการที่แพงที่สุดด้วย


4
อาเป็นสัมผัสที่ดีคืนสินค้าทั้งหมด ไม่จำเป็นในกรณีนี้ แต่เป็นผู้รักษาอนาคตอย่างแน่นอน
Hank Fay

นั่นคือสิ่งที่ฉันกำลังมองหา น่ากลัว ขอบคุณ!
svenwildermann

ทางออกที่สวยงาม!
anapaulagomes

2
@ thomas.mac คุณสามารถเรียงลำดับแล้วเลือก 5 อันดับแรก? ดูstackoverflow.com/questions/72899/…
hibernado

2
นี้ทำงานได้อย่างสมบูรณ์ ตามความคิดเห็นของ @ thomas.mac มีวิธีง่ายๆในการรับminima ทั้งหมดหรือไม่หากมีหลายตัว (เช่นรายการของคำสั่งที่ตรงกันเป็นต้น)
Romain

44

ฉันคิดว่าการแสดงออกที่ตรงที่สุด (และส่วนใหญ่ของ Pythonic) จะเป็นดังนี้:

min_price = min(item['price'] for item in items)

วิธีนี้จะหลีกเลี่ยงค่าใช้จ่ายในการจัดเรียงรายการและโดยใช้นิพจน์ตัวสร้างแทนการทำความเข้าใจรายการ - หลีกเลี่ยงการสร้างรายการใด ๆ เช่นกัน มีประสิทธิภาพตรงอ่านได้ ... Pythonic!


9

คำตอบหนึ่งที่จะทำแผนที่ dicts ของคุณเพื่อความคุ้มค่าที่น่าสนใจภายในแสดงออกกำเนิดและจากนั้นใช้ตัว -ins และminmax

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)

nitpick: นี่คือนิพจน์เครื่องกำเนิดไฟฟ้า ความเข้าใจในรายการล้อมรอบด้วย[และ]และสร้างรายการ Python เป็นขั้นตอนกลาง
dcrosta

@dcrosta ใช่ขอบคุณคุณพูดถูกแน่นอน ฉันเปลี่ยนคำพูดตั้งแต่นั้นมันน่าอาย
rlibby

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.