#python #python-3.x #list
#питон #python-3.x #Список
Вопрос:
def mode(list): modelist = max([list.count(x) for x in list]) return [i for i in list if list.count(i) == modelist][0]
По сути, приведенный выше код работает в большинстве случаев. Однако я хочу, чтобы код предпочитал меньшее значение, когда есть два равных значения. поэтому, если входной список был [5,2,2,5], я хочу, чтобы он печатал 2 вместо печати 5
Ответ №1:
Есть ли причина, по которой вы не хотите использовать многомодовый режим из библиотеки статистики?
from statistics import multimode print (min(multimode([2,5,2,5,3,3])))
Ответ №2:
Вы можете вернуть min
список, который у вас уже есть:
def mode(lst): modelist = max(lst.count(x) for x in lst) return min(i for i in lst if lst.count(i) == modelist) print(mode([5, 2, 2, 5])) # 2
Код в нынешнем виде имеет довольно большую временную сложность; я думаю, что это O(n^2). Чтобы уменьшить его, вы можете настроить счетчик (например, с помощью collections.Counter
):
from collections import Counter def mode(lst): return min(x[1] for x in Counter(lst).most_common(1))
С длинным списком , например [5, 2, 2, 5] * 5000
, потраченное время составляет 7,429 против 0,002 секунды (на моей машине).