2011-02-10 9 views
7

की सूची की सूची में अधिकतम मूल्य मुझे टुपल्स की सूची की गतिशील सूची में उच्चतम मूल्य प्राप्त करने में समस्या है। उच्चतम मूल्य (पूर्णांक) प्राप्त करने के लिए सूची के माध्यम सेट्यूपल

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]] 

अब मैं पाश:

total = {} 
y=0 
while y < len(adymlist): 
    if len(adymlist) == 1: 
     #has the List only 1 Element -> save it in total 
     total[adymlist[y][0][0]] = adymlist[y][0][1] 
     y += 1 
    else: 
     # here is the problem 
     # iterate through each lists to get the highest Value 
     # and you dont know how long this list can be 
     # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..} 

मैं अधिकतम मूल्य प्राप्त करने के लिए एक बहुत कोशिश की, लेकिन मैंने पाया
कर सकते हैं सूची इस तरह दिखता है मेरी समस्या का कोई निष्कर्ष नहीं। मुझे पता है कि मुझे सूची में प्रत्येक टुपल के माध्यम से लूप करना होगा और इसे अगले के साथ तुलना करना चाहिए, लेकिन यह नहीं जानता कि इसे सही तरीके से कैसे कोड किया जाए।

इसके अलावा मैं फ़ंक्शन max() का उपयोग कर सकता हूं लेकिन यह स्ट्रिंग्स और पूर्णांक के साथ काम नहीं करता है। उदा a = [ ('a',5),('z',1)] -> परिणाम max(a) ---> ('z',1) obv 5> 1 लेकिन z> इसलिए मैंने अधिकतम फ़ंक्शन को max(a, key=int) के साथ विस्तारित करने का प्रयास किया लेकिन मुझे एक प्रकार त्रुटि मिली।

आशा है कि आप समझ सकते हैं कि मैं क्या चाहता हूँ ;-)

अद्यतन

धन्यवाद अब तक।

अगर मैं itertools.chain(*adymlist) और max(flatlist, key=lambda x: x[1])
का उपयोग मैं मिल जाएगा की तरह एक अपवाद: max_word = अधिकतम (flatlist, कुंजी = लैम्ब्डा एक्स: एक्स [1]) लेखन त्रुटि: 'int' वस्तु unsubscriptable है

लेकिन मैं तो itertools.chain(adymlist) का उपयोग करें यह ठीक काम करता है। लेकिन मुझे नहीं पता कि सूची के प्रत्येक टुपल से सभी पूर्णांक कैसे समेटें। मुझे इसे समझने में आपकी मदद की ज़रूरत है।

अन्यथा मैंने उस सूची में सभी पूर्णांक और उच्चतम पूर्णांक के योग प्राप्त करने के लिए itertools.chain(*adymlist) के लिए एक कार्यवाही लिखा।

chain = itertools.chain(*adymlist) 
flatlist = list(chain) 
# flatlist = string, integer, string, integer, ... 
max_count = max(flatlist[1:len(flatlist):2]) 
total_count = sum(flatlist[1:len(flatlist):2]) 
# index of highest integer 
idx = flatlist.index(next((n for n in flatlist if n == max_count))) 
max_keyword = flatlist[idx-1] 

यह अभी भी जो मैं चाहता है, लेकिन यह गंदा करने के लिए नहीं है?

उत्तर

16

स्पष्टीकरण के लिए, ऐसा लगता है कि आपको टुपल्स की सूचियों की एक सूची मिली है। यह नहीं दिखता है जैसे हम क्या सूची वे में हैं के बारे में परवाह है, तो हम दो कदम

  • tuples की एक सूची के लिए सूचियों की सूची फ़्लैट को यह सरल बना सकते हैं
  • अधिकतम मान ज्ञात

पहले भाग itertools.chain के माध्यम से पूरा किया जा सकता है (उदाहरण के लिए देखते हैं, Flattening a shallow list in Python)

दूसरा अधिकतम के माध्यम से हल किया जा सकता है, तो आप सही पता नहीं है, लेकिन आप एक समारोह के बजाय प्रकार आप चाहते हैं में गुजर जाना चाहिए। इस समारोह, मूल्य तुम पर keyed गया है वापस जाने के लिए इस मामले में जरूरत टपल के दूसरे भाग

max(flatlist, key=lambda x: x[1]) 

सुधार

मैं फिर से पढ़ अपने प्रश्न - आप अधिकतम के लिए देख रहे हैं प्रत्येक उप-सूची में मूल्य? यदि यह मामला है, तो केवल दूसरा भाग लागू है।सीधे शब्दों में प्रत्येक सूची

थोड़ा के लिए आपके वर्तमान की तुलना में अधिक pythonic के लिए अपनी सूची से अधिक पुनरावृति

output = [] 
for lst in lists: 
    output.append(max(flatlist, key=lambda x: x[1])) 

या

map(lambda x: max(x, key=lambda y: y[1]) , lists) 
4

spintheblack कहते हैं चाहते हैं, तो आप tuples की सूची की एक सूची है । मुझे लगता है कि आप सभी tuples के उच्चतम पूर्णांक मूल्य की तलाश में हैं।

फिर आप इस तरह tuples tuples की सूची पर बाहरी सूची पर पुनरावृति कर सकते हैं,:

max_so_far = 0 
for list in adymlist: 
    for t in list: 
    if t[1] > max_so_far: 
     max_so_far = t[1] 
print max_so_far 

यह थोड़ा और अधिक वर्बोज़ है, लेकिन समझने के लिए आसान हो सकता है।