2012-04-01 22 views
8

Mam listę:Python max przy tej samej liczbie przypadków

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

Chciałem, aby wyświetlić najczęściej element na liście, więc użyłem:

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

jednak zdałem sobie sprawę, że mogą istnieć dwa elementy listy, które występują na tej samej częstotliwości, takie jak 1 i 2 na powyższej liście. Max wyprowadza tylko pierwszą instancję elementu o maksymalnej częstotliwości.

Jakie polecenie może sprawdzić listę, aby zobaczyć, czy oba elementy mają maksymalną liczbę wystąpień, a jeśli tak, to wypisać je jednocześnie? Brak mi tutaj.

Odpowiedz

13

Stosując podejście podobne do prądu, należy najpierw znaleźć maksymalną liczbę, a następnie spojrzeć na każdej pozycji z tym ilość:

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

Alternatywnie, można użyć piękny Counter klasy, które mogą być wykorzystane efektywne, dobrze, liczyć rzeczy:

>>> 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)] 

Następnie można użyć wyrażeń listowych, aby wszystkie elementy, które mają maksymalną ilość:

>>> set(x for x, count in common if count == common[0][1]) 
set(['1', '2']) 
+0

co czasie, gdy występują trzy powtórzone liczb, jak [ '1' '1', '2', '2', '8', 7 " "7"] ... Twój scenariusz nie zadziała. Dzięki, w przeciwnym razie rozwiązanie jest dobre. –

+0

@james: Nie można odtworzyć, zwraca 'set (['1', '2', '7'])' dla mnie z obydwoma fragmentami kodu. –

+0

Ach tak, nie ma problemu, teraz działa świetnie. Wielkie dzięki. –

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)) 

wyjściowa:

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'] 

napisałem ten prosty program, myślę, że może również pracować. Nie wiedziałem o funkcji most_common(), dopóki nie wykonam wyszukiwania. Myślę, że powróci to jak najczęstszy element, działa przez porównanie maksymalnego elementu, gdy widzę częstszy element, usunie listę wyników i doda ją raz; lub jeśli ma tę samą częstotliwość, po prostu się do niej dołącza. I kontynuuj, dopóki cały Licznik nie zostanie powtórzony.

+0

To jest świetny przykład! Pokazuje, jak zrobić to sam, jeśli nie szukasz tylko najprostszego sposobu. – agf

+2

Nauczyłem się też czegoś, nauczyłem się, jak działa funkcja 'most_common()' i dodałem do niej zakładkę na wypadek, gdyby w przyszłości potrzebowałem tej konkretnej funkcji. Tak więc dla nas wszystkich jest to wygrana-wygrana, okrzyki! – George

3

Edycja: Zmiana roztwór

>>> 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, ładne i czyste rozwiązanie. Ostatnia linia mogłaby być nieznacznie uproszczona do 'd [max (d)] :) :) –

+1

Dzięki, teraz wygląda jeszcze ładniej: D – jamylak

+0

Problem z tą metodą to O (n ** 2). 'sequence.count' to O (n) i robisz to raz dla każdego elementu w sekwencji.Metoda "Counter" lub odpowiednik zakodowany ręcznie to O (n) - liczba operacji na element jest niezależna od liczby elementów w sekwencji. – agf

Powiązane problemy