튜플리스트가 있는데 가장 자주 발생하는 튜플을 얻고 싶습니다. 그러나 "공동 수상자"가있는 경우 무작위로 선택해야합니다.Python : 목록에서 가장 빈번한 항목 가져 오기
tups = [ (1,2), (3,4), (5,6), (1,2), (3,4) ]
그래서는 반환 뭔가를 원하는 중 (1,2) 또는 위의 목록
튜플리스트가 있는데 가장 자주 발생하는 튜플을 얻고 싶습니다. 그러나 "공동 수상자"가있는 경우 무작위로 선택해야합니다.Python : 목록에서 가장 빈번한 항목 가져 오기
tups = [ (1,2), (3,4), (5,6), (1,2), (3,4) ]
그래서는 반환 뭔가를 원하는 중 (1,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]
에 대한 무작위로 (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)]
사용 collections.Counter
:
>>> collections.Counter([ (1,2), (3,4), (5,6), (1,2), (3,4) ]).most_common()[0]
((1, 2), 2)
이것은 O(n log(n))
입니다.
, 그것은 O (n)에서 할 수 있습니다. 주파수를 계산하고 최대 값을 얻은 다음 가장 높은 주파수를 가진 모든 항목을 가져옵니다. 적어도 4 명이 알지 못합니다. –
O (n)에서 이것을 수행 할 수 없습니다. 모든 주파수를 계산하려면 해시 테이블이 필요합니다. – simonzack
AFAIK 카운터는 사전으로 구현되며 사전의 설정 요소는 평균적으로'O (1)'입니다. 당신의 대답'most_common()'메서드는 모든 요소를 정렬하여 가장 많은 부분을 처리 할 것입니다. - O (n log (n)) –
이 하나가 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)
이것은 'O (n)'이 아니며 모든 요소가 unqiue 인 경우를 생각해보십시오. – simonzack
https://wiki.python.org/moin/TimeComplexity 사전의 요소 설정은 O (1) 평균입니다. –
이 가장 일반적인 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
실제로 @Juddling은 most_common()이 필요하지 않습니다 - 내 대답을 참조하십시오 –
@RomanPekar 왜 내가 most_common()을 사용하는 것을 피하고 싶습니까? – Juddling
실수가 아니라면 most_common()이 전체 목록을 정렬하고 최대 주파수 만 필요합니다. –