Номер с самой высокой частотой в списке - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь написать программу, которая покажет мне номер, который чаще всего появляется в списке. Я пытаюсь сделать это без импорта каких-либо библиотек. Пока у меня есть кое-что, что даст мне количество раз, которое появляется наиболее часто, но мне нужно само число, а не сколько раз оно появляется. Как я могу изменить то, что у меня есть, простым способом?

def freq(L):
    st = []
    L.sort()
    for i in L:
        st.append(L.count(i))
    print max(st)

EDIT: например, freq ([4, 6, 4, 3, 9, 1, 4]) возвращает 3, поскольку 4 появляется 3 раза. Но я бы хотел вернуть 4, как в наиболее частом значении.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

list.count имеет сложность O ( n ), учитывая n значений в вашем списке. Если есть m уникальных значений, это означает, что ваш алгоритм будет иметь минимальную сложность O ( m x n ). Это не желательно.

Одним из решений O ( n ) является создание счетного словаря и значений приращения при итерации:

lst = [1, 2, 3, 3, 3, 2, 1, 3, 3]

def freq(L):
    d = {}
    for num in L:
        d[num] = d.get(num, 0) + 1
    maxcount = max(d.values())
    return next(k for k, v in d.items() if v == maxcount)

freq(lst)  # 3

Конечно, с collections.Counter синтаксис тривиален:

from collections import Counter

def freq(L):
    return Counter(L).most_common()[0][0]
0 голосов
/ 06 сентября 2018

Вот один из способов сделать это со списком:

mostFrequentNumber = L[max([(L.count(d), i) for i, d in enumerate(L)])[1]]

Чтобы разбить его:

Итерируем перечисленную версию списка: i, d in enumerate(L), который будет производить кортежи со значением и индексом. Затем мы создаем список кортежей с count из d и индексом i: (L.count(d), i). Мы используем функцию Max, чтобы получить ту, которая имеет наибольшее количество. Затем мы индексируем список L, используя самое высокое значение индекса [1] в кортеже.

Этот вход: L = [1, 1, 1, 2, 3, 4] в результате выдаст 1, хотя, возможно, не самый эффективный.

0 голосов
/ 06 сентября 2018

Попробуйте словари

def freq(L):
     st = {}
     for i in set(L):
        st.update({L.count(i):i})
     print (st.get(max(st)))

или короче:

def freq(L):
    st={L.count(i):i for i in set(L)}
    print (st.get(max(st)))

другое решение без словарей:

def freq(L):
    a=0
    b=None
    for e in set(L):
        if L.count(e)>a:
            a=L.count(e)
            b=e
    print(b)
...