डिकेट्स की सूची में, एक सामान्य डिक्ट क्षेत्र का न्यूनतम () मान ज्ञात करें


94

मेरे पास शब्दकोशों की एक सूची है जैसे:

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

मैं न्यूनतम () और अधिकतम () कीमतें खोजना चाहता हूं। अब, मैं एक लैम्ब्डा अभिव्यक्ति के साथ एक कुंजी का उपयोग करके इसे आसानी से पर्याप्त रूप से सॉर्ट कर सकता हूं (जैसा कि एक अन्य एसओ लेख में पाया गया है), इसलिए यदि कोई अन्य तरीका नहीं है तो मैं अटक नहीं रहा हूं। हालांकि, मैंने जो कुछ देखा है, उसमें से लगभग हमेशा पाइथन में एक सीधा रास्ता है, इसलिए यह मेरे लिए थोड़ा और सीखने का अवसर है।

जवाबों:


61

कई विकल्प हैं। यहाँ एक सीधा आगे है:

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

[संपादित करें]

यदि आप केवल एक बार सूची के माध्यम से पुनरावृति करना चाहते हैं, तो आप यह कोशिश कर सकते हैं (मानों को intएस के रूप में दर्शाया जा सकता है ):

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)

मैं इसे उत्तर के रूप में स्वीकार करता हूं क्योंकि यह न केवल उत्तर देता है, बल्कि इसने मुझे यह भी दिखाया कि व्यक्ति एक अनुक्रमण कर सकता है। डैरन, पायथन एक खूबसूरत भाषा है। धन्यवाद!
हैंक फे

2
यदि आपको इसकी आवश्यकता नहीं है seq, और सूची बड़ी है, तो यह अक्षम हो सकता है क्योंकि पूरी सूची के लिए मेमोरी को केवल अधिकतम खोजने के लिए आवंटित किया जाना है।
चार्ल्स एल।

यह फेंकता हैAttributeError: module 'sys' has no attribute 'maxint'
सनकैचर

241
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
आह, यह एक अच्छा स्पर्श है, पूरे आइटम को वापस कर रहा है। इस उदाहरण में जरूरत नहीं है, लेकिन निश्चित रूप से भविष्य के लिए एक रक्षक है।
हांक फे

कि मैं क्या देख रहा था। बहुत बढ़िया। धन्यवाद!
svenwildermann

एक सुरुचिपूर्ण समाधान!
अनपुलगोम्स

2
@ thomas.mac आप सॉर्ट कर सकते हैं और फिर शीर्ष 5 का चयन कर सकते हैं? देख stackoverflow.com/questions/72899/...
hibernado

2
यह पूरी तरह से काम करता है। बाद @ thomas.mac की टिप्पणी, वहाँ एक आसान तरीका प्राप्त करने के लिए है सब न्यूनतम (उदाहरण के लिए dict मिलान की एक सूची के रूप में,) करता है, तो वहाँ कई हैं?
रोमेन

44

मुझे लगता है कि सबसे प्रत्यक्ष (और सबसे पायथन) अभिव्यक्ति कुछ इस तरह होगी:

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

यह सूची को सॉर्ट करने के ओवरहेड से बचा जाता है - और, एक जनरेटर की अभिव्यक्ति का उपयोग करके, एक सूची समझ के बजाय - वास्तव में किसी भी सूची बनाने से बचा जाता है, साथ ही साथ। कुशल, प्रत्यक्ष, पठनीय ... पायथोनिक!


9

एक उत्तर जनरेटर अभिव्यक्ति के अंदर ब्याज के मूल्य के लिए आपके डिट्स को मैप करना होगा, और फिर बिल्ट-इन minऔर लागू करना होगा max

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

नाइटपिक: वे जनरेटर के भाव हैं। सूची comprehensions से घिरे रहे हैं [और ], और वास्तव में एक मध्यवर्ती कदम के रूप में एक अजगर सूची उत्पन्न करते हैं।
dcrosta

@dcrosta, हाँ, धन्यवाद, आप निश्चित रूप से सही हैं। मैंने उस शब्द को बदल दिया जब से वह शर्मनाक था।
rlibby

3

यह भी उपयोग कर सकते हैं:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.