Наиболее частые целое число в список


Здесь была моя попытка найти наиболее частыми целых чисел в список, я чувствую, что есть лучшие способы сделать это, и я потратил много времени, придумывая это решение, поэтому, пожалуйста, мне точку в правильном направлении!

'''
Created on Jan 27, 2018
Problem statement: Find the most frequently occuring integer in a list and its occurence;
    input: 1 1 2 3 2 1 2
    output: [(1,3), (2, 3)]

@author: Anonymous3.1415
'''
from collections import Counter

def integer_frequency(int_list):
    int_freq = Counter()
    for i in int_list:
        int_freq[i] += 1
    cnt = 0
    values = sorted(int_freq.values())
    values.reverse()
    for x in values:
        if x == values[0]:
            cnt += 1
        else:
            break
    return int_freq.most_common(cnt)



int_list = list(map(int, raw_input().strip().split(' ')))
most_frequent = integer_frequency(int_list)
print(most_frequent)


1430
4
задан 27 января 2018 в 11:01 Источник Поделиться
Комментарии
2 ответа

Вы могли бы использовать itertools.takewhile продолжать принимать ОК до тех пор пока они не совпадают нужен:

from collections import Counter
from itertools import takewhile

def integer_frequency(integers):
int_freq = Counter(integers)
most_common = int_freq.most_common(1)[0]
return list(takewhile(lambda x: x[1] == most_common[1],
int_freq.most_common()))

Я тоже переименовать integer_list для integers, потому что он может быть любым итерируемым чисел.

В качестве альтернативы, вы могли бы использовать itertools.groupby для группы кортежей по их частоте и возвращение группы с наибольшей частотой, как @Гарет Риз предложил в комментариях:

from collections import Counter
from itertools import groupby

def integer_frequency(integers):
return list(next(groupby(Counter(integers).most_common(),
key=lambda x: x[1]))[1])

Этот подход последовательно быстрее (на небольшую сумму):

enter image description here

Однако, как побить свой алгоритм довольно много:

enter image description here

5
ответ дан 29 января 2018 в 01:01 Источник Поделиться

Есть некоторые вещи, которые сделают этот код чище и быстрее. int_freq = Counter(int_list) автоматически инициализировать счетчик без тебя делать работу. Также values = sorted(int_freq.values(), reverse=True) будет чище и быстрее. Кроме того, что это выглядит довольно хорошо.

5
ответ дан 27 января 2018 в 11:01 Источник Поделиться