2014-09-19 1 views
1

{(f1, f2) : counts} 형식의 카운터가 있습니다. 이 때 Counter.most_common()을 실행하면 올바른 결과를 얻지 만 f2의 일부 필터에 대해서는 most_common()을 필터링하려고합니다. 예를 들어 f2 = 'A'는 f2 = 'A'인 most_common 요소를 반환해야합니다. 이 작업을 수행하는 방법? 우리가 Counter에 대한 소스 코드를 보면파이썬에서 카운터에 대해 필터링 된 most_common()

+3

모바일에서 그렇게 확실하지는 않지만 항목 [0] [1] == 'A'], key = operator.itemgetter (1), reverse = [item.items (item) 사실) [: 10]' – roippi

+0

@roippi 효과가있었습니다. 당신이 대답을 기입하면 나는 그것을 받아 들일 것입니다. – codepk

답변

0

우리는 k 키의 수를 원하고 O(n log n)에 반대 n에서, Counter의 크기입니다 O(n + k log n)을 유지 heapq를 사용하는 것을 알 수있다. 풀기 만이 중요한 경우, 그것은 조금 더 빨리 만들 수 있습니다

counts = Counter([(1, "A"), (2, "A"), (1, "A"), (2, "B"), (1, "B")]) 

Counter({(f1, f2): n for (f1, f2), n in counts.items() if f2 == "A"}).most_common(2) 
#>>> [((1, 'A'), 2), ((2, 'A'), 1)] 

:이 이상 O(n) 때문에

def most_common(self, n=None): 
    '''List the n most common elements and their counts from the most 
    common to the least. If n is None, then list all element counts. 

    >>> Counter('abcdeabcdabcaba').most_common(3) 
    [('a', 5), ('b', 4), ('c', 3)] 

    ''' 
    # Emulate Bag.sortedByCount from Smalltalk 
    if n is None: 
     return sorted(self.items(), key=_itemgetter(1), reverse=True) 
    return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) 

, 우리는 단지 카운터를 필터링하고 해당 항목을 얻을 수 있습니다

import heapq 
from operator import itemgetter 

filtered = [((f1, f2), n) for (f1, f2), n in counts.items() if f2 == "A"] 
heapq.nlargest(2, filtered, key=itemgetter(1)) 
#>>> [((1, 'A'), 2), ((2, 'A'), 1)] 
관련 문제