Znajdowanie dominanty zbioru

0

Hej,
aktualnie przerabiamy algorytmy na studiach i spróbowałem swoich sił w metodzie naiwnej.

import random
myList = []
N = 15
maxL = 0
maxW = 0
for i in range(0,N):
    myList.append(random.randint(0,10))
for i in range(0,N):
    W = myList[i]
    L = 0
    for j in range(0,N):
        if (myList[j] == W):
            L=L+1
        if (L > maxL):
            maxL = L
            maxW = W
for i in myList:
    print(i)
print('Najczestszy element ' + str(maxW) + ' wystapil: ' + str(maxL) + ' razy')

# Drugi sposob
maxW = 0
maxL = 0
for i in myList:
    freq = myList.count(i)
    if freq > maxW:
        maxL = freq
        maxW = myList[i]
print('Najczestszy element ' + str(maxW) + ' wystapil: ' + str(maxL) + ' razy')

Pomijam już fakt, że szybkość działania nie należy do najszybszych, jestem dopiero początkującym.
Czy ktoś byłby w stanie pomóc znaleźć w miarę optymalne rozwiązanie metody naiwnej oraz co zrobić w przypadku gdy 2 cyfry występują tą samą ilość razy? A drugie pytanie mam odnośnie tego kawałka kodu:

for i in range(0,N):
    W = myList[i]
    L = 0
    for j in range(0,N):
        if (myList[j] == W):
            L=L+1
        if (L > maxL):
            maxL = L
            maxW = W

W debuggerze w Visual Studio Code najpierw jest przelatywana 15 razy wartość i =0, później 15 razy i=1 itd. Natomiast te same pętle napisane w C++ wydaje mi się, że debugują się trochę inaczej, mianowicie zawsze wraca na początek pętli do i, a nie tylko do j. Czy ktoś byłby w stanie to wytłumaczyć?

1

Lista w Pythonie ma metodę count (z dokumentacji: L.count(value) -> integer -- return number of occurrences of value); Możesz ja przekazać do funkcji max(z biblioteki standartowej):

def find_mode(xs):
	return max(set(xs), key=xs.count)

https://stackoverflow.com/questions/10797819/finding-the-mode-of-a-list

0

tutaj masz rozwiazanie bardziej na piechote jesli dobrze zrozumialem zadanie

def get_dominant(result):
    out = [] #zakladamy ze moga byc 2 ktore maja tyle samo wystapien
    _max = 0
    for i in range(2):
        for row in result.iteritems():
            if row[1] > _max and row not in out:
                _max = row
        out.append(_max)
        _max = 0
    return out
        


def find_dominant(_list):
    unique_elements = set(_list)
    template = {}
    for digit in unique_elements:
        template[digit] = 0
    
    for item in _list:
        template[item] += 1
    return get_dominant(template)

li = [1,1,1,1,2,3,3,3,3]
print(find_dominant(li))

0

ja bym zrobił pandasem:

pd.Series(x).value_counts().head(1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1