2013-09-16 2 views
3

튜플리스트가 있는데 가장 자주 발생하는 튜플을 얻고 싶습니다. 그러나 "공동 수상자"가있는 경우 무작위로 선택해야합니다.Python : 목록에서 가장 빈번한 항목 가져 오기

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

그래서는 반환 뭔가를 원하는 중 (1,2) 또는 위의 목록

답변

2

먼저 Counter를 사용하여 가장 반복되는 튜플을 찾을 수 있습니다. 그런 다음 필요한 튜플을 찾아 마침내 무작위로 만들어 첫 번째 값을 얻습니다.

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

실제로 @Juddling은 most_common()이 필요하지 않습니다 - 내 대답을 참조하십시오 –

+0

@RomanPekar 왜 내가 most_common()을 사용하는 것을 피하고 싶습니까? – Juddling

+0

실수가 아니라면 most_common()이 전체 목록을 정렬하고 최대 주파수 만 필요합니다. –

1

에 대한 무작위로 (3,4) 당신은 제 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 카운터는 사전으로 구현되며 사전의 설정 요소는 평균적으로'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 
관련 문제