2012-04-01 15 views
8

मैं एक सूची है:अजगर अधिकतम

hello = ['1', '1', '2', '1', '2', '2', '7'] 

मैं सूची का सबसे आम तत्व को प्रदर्शित करना चाहता था, इसलिए मैं प्रयोग किया है:

m = max(set(hello), key=hello.count) 

हालांकि, मुझे लगता है कि एहसास हुआ सूची के दो तत्व हो सकते हैं जो समान आवृत्ति होती है, जैसे ऊपर की सूची में 1 और 2 की तरह। अधिकतम अधिकतम आवृत्ति तत्व के पहले उदाहरण को आउटपुट करता है।

किस प्रकार की कमांड एक सूची की जांच कर सकती है यह देखने के लिए कि क्या दो तत्वों में अधिकतम संख्या में उदाहरण हैं, और यदि ऐसा है, तो दोनों को आउटपुट करें? मैं यहाँ एक नुकसान में हूँ।

उत्तर

13

एक दृष्टिकोण अपने वर्तमान के समान उपयोग करके, आप अधिकतम संख्या से मिलेगा और फिर उस गिनती के साथ हर आइटम के लिए देखो:

>>> m = max(map(hello.count, hello)) 
>>> set(x for x in hello if hello.count(x) == m) 
set(['1', '2']) 

वैकल्पिक रूप से, आप अच्छा Counter वर्ग का उपयोग कर सकते है, जो इस्तेमाल किया जा सकता कुशलता से, ठीक है, सामान गिनती करने के लिए:

:

>>> hello = ['1', '1', '2', '1', '2', '2', '7'] 
>>> from collections import Counter 
>>> c = Counter(hello) 
>>> c 
Counter({'1': 3, '2': 3, '7': 1}) 
>>> common = c.most_common() 
>>> common 
[('1', 3), ('2', 3), ('7', 1)] 

तो आप सभी आइटम है कि अधिकतम संख्या से अधिक है प्राप्त करने के लिए एक सूची समझ का उपयोग कर सकते

+0

क्या बार जब देखते हैं के बारे में 3 बार-बार नंबर की तरह [ '1', '1', '2', '2', '8', '7',, '7'] ... आपकी लिपि इसके लिए काम नहीं करेगी। धन्यवाद, अन्यथा समाधान अच्छा है। –

+0

@james: पुन: पेश नहीं किया जा सकता है, यह दोनों कोड स्निपेट के साथ 'सेट ([' 1 ',' 2 ',' 7 ']) देता है। –

+0

आह हाँ, कोई समस्या नहीं, यह अब मेरे लिए बहुत अच्छा काम कर रहा है। बहुत धन्यवाद। –

2
from collections import Counter 

def myFunction(myDict): 
    myMax = 0 # Keep track of the max frequence 
    myResult = [] # A list for return 

    for key in myDict: 
     print('The key is', key, ', The count is', myDict[key]) 
     print('My max is:', myMax) 
     # Finding out the max frequence 
     if myDict[key] >= myMax: 
      if myDict[key] == myMax: 
       myMax = myDict[key] 
       myResult.append(key) 
      # Case when it is greater than, we will delete and append 
      else: 
       myMax = myDict[key] 
       del myResult[:] 
       myResult.append(key) 
    return myResult 

foo = ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2'] 
myCount = Counter(foo) 
print(myCount) 

print(myFunction(myCount)) 

आउटपुट:

The list: ['1', '1', '5', '2', '1', '6', '7', '10', '2', '2'] 
Counter({'1': 3, '2': 3, '10': 1, '5': 1, '7': 1, '6': 1}) 
The key is 10 , The count is 1 
My max is: 0 
The key is 1 , The count is 3 
My max is: 1 
The key is 2 , The count is 3 
My max is: 3 
The key is 5 , The count is 1 
My max is: 3 
The key is 7 , The count is 1 
My max is: 3 
The key is 6 , The count is 1 
My max is: 3 
['1', '2'] 

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

+0

यह एक महान उदाहरण है! यह दिखाता है कि अगर आप केवल सबसे आसान तरीके की तलाश नहीं कर रहे हैं तो इसे स्वयं कैसे करें। – agf

+2

मैंने कुछ भी सीखा, मैंने सीखा कि 'most_common()' फ़ंक्शन कैसे काम करता है, और भविष्य में इसे बुकमार्क करने के लिए मुझे उस विशेष फ़ंक्शन की आवश्यकता होती है। तो यह हम सभी के लिए जीत-जीत है, चीयर्स! – George

3

संपादित करें: बदल दिया समाधान

>>> from collections import Counter 
>>> from itertools import groupby 
>>> hello = ['1', '1', '2', '1', '2', '2', '7'] 
>>> max_count, max_nums = next(groupby(Counter(hello).most_common(), 
           lambda x: x[1])) 
>>> print [num for num, count in max_nums] 
['1', '2'] 
+0

+1, अच्छा और साफ समाधान। अंतिम पंक्ति को 'डी [अधिकतम (डी)]' :) –

+1

पर मामूली रूप से सरलीकृत किया जा सकता है धन्यवाद, अब यह भी अच्छा लगता है: डी – jamylak

+0

इस विधि के साथ समस्या यह है ओ (एन ** 2)। 'sequence.count' ओ (एन) है और आप अनुक्रम में प्रत्येक आइटम के लिए इसे एक बार करते हैं।'काउंटर' विधि, या हाथ से कोडित समकक्ष, ओ (एन) है - प्रति आइटम संचालन की संख्या अनुक्रम में वस्तुओं की संख्या से स्वतंत्र है। – agf