как найти режим списка, который предпочитает меньшее значение, когда 2 значения отображаются одинаково

#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 секунды (на моей машине).