2013-09-16 3 views
3

У меня есть список кортежей, и я хочу получить наиболее часто встречающийся кортеж, но если есть «совместные победители», он должен выбирать между ними наугад.Python: Получить наиболее часто используемый элемент в списке

tups = [ (1,2), (3,4), (5,6), (1,2), (3,4) ] 

поэтому я хочу что-то, что возвращение будет либо (1,2) или (3,4) в случайном порядке для приведенного выше списка

ответ

2

Вы можете сначала использовать счетчик, чтобы найти наиболее повторяющиеся кортежи. Затем найдите необходимые кортежи и, наконец, рандомизируйте и получите первое значение.

from collections import Counter 
import random 

tups = [ (1,2), (3,4), (5,6), (1,2), (3,4) ] 
lst = Counter(tups).most_common() 
highest_count = max([i[1] for i in lst]) 
values = [i[0] for i in lst if i[1] == highest_count] 
random.shuffle(values) 
print values[0] 
+0

@ На самом деле вам не нужно most_common() - см. Мой ответ –

+0

@RomanPekar Я вижу, почему я бы хотел избежать использования most_common()? – Juddling

+0

Если я не ошибаюсь, most_common() сортирует весь список, и вам просто нужна максимальная частота –

1

Вы можете сначала отсортировать список, чтобы получить кортежи, упорядоченные по частоте. После этого линейное сканирование может получить наиболее частый кортеж из списка. Общее время O(nlogn)

>>> tups = [ (1,2), (3,4), (5,6), (1,2), (3,4) ] 
>>> 
>>> sorted(tups) 
[(1, 2), (1, 2), (3, 4), (3, 4), (5, 6)] 
10

collections.Counter Использование:

>>> collections.Counter([ (1,2), (3,4), (5,6), (1,2), (3,4) ]).most_common()[0] 
((1, 2), 2) 

Это O(n log(n)).

+0

на самом деле, если вам нужно наиболее частый элемент, это можно сделать в O (n). Вы просто подсчитываете частоты, получаете максимум, а затем получаете все предметы с самыми высокими частотами. как минимум 4 человека не знают этого :) –

+0

Это невозможно сделать в O (n), считая все частоты сами по себе, требует какой-то хеш-таблицы. – simonzack

+0

AFAIK Counter реализуется как словарь, а элемент настройки словаря - 'O (1)' в среднем. В вашем ответе 'most_common()' метод будет делать вид всех элементов, так что это будет самая тяжелая часть - O (n log (n)) –

1

Это следует делать свою задачу в o(n) время:

>>> from random import shuffle 
>>> from collections import Counter 
>>> 
>>> tups = [(1,2), (3,4), (5,6), (1,2), (3,4)] 
>>> c = Counter(tups)       # count frequencies 
>>> m = max(v for _, v in c.iteritems())   # get max frq 
>>> r = [k for k, v in c.iteritems() if v == m] # all items with highest frq 
>>> shuffle(r)         # if you really need random - shuffle 
>>> print r[0] 
(3, 4) 
+1

Это не 'O (n)', подумайте о том, где все элементы являются unqiue. – simonzack

+0

https://wiki.python.org/moin/TimeComplexity настройка элемента в словаре - это O (1) среднее значение –

0

Подсчет с collections.Counter и затем случайным выбором из наиболее распространенных:

import collections 
import random 

lis = [ (1,2), (3,4), (5,6), (1,2), (3,4) ] # Test data 
cmn = collections.Counter(lis).most_common() # Numbering based on occurrence 
most = [e for e in cmn if (e[1] == cmn[0][1])] # List of those most common 
print(random.choice(most)[0]) # Print one of the most common at random 
Смежные вопросы