2016-07-10 3 views
3

현재이 코드가 있습니다. 배열의 모든 요소가 동일한 지 확인합니다. 이 경우 사실을 반환하십시오.frozenset x 개 이상 요소

def all_equal(lst): 
    """ 
    >>> all_equal([1,1,1,1,1,1,1]) 
    True 
    >>> all_equal([1,2,3,1]) 
    False 
    """ 
    return len(frozenset(lst)) == 1 

하지만 적어도 5 가지 요소가 동일한 지 확인하고 싶습니다.

은 그래서

[1,1,1,1,1,2,2] 

는 진정한 aswell를 반환합니다. 5 번이므로 1

답변

7

집합을 사용하는 대신 bag or multiset type을 사용하십시오. 다중 집합은 고유 값이 몇 번 발생하는지 계산합니다.

collections.Counter() object 파이썬에서

의 그 :

from collections import Counter 

def all_equal(lst): 
    bag = Counter(lst) 
    if any(v >= 5 for v in bag.itervalues()): 
     # an element occurred at least 5 times 
     # (use bag.values() if using Python 3) 
     return True 
    return False 
+0

하지만 사실이 아니라고해도 True를 반환합니다. – Sharpless512

+0

@ Sharpless512 : 그렇다면 언제 그렇지 않습니까? 구체적으로 기재하십시오. –

+0

@ Sharpless512 : 귀하의 질문은 두 가지 조건에 대해 true를 반환하고자 함을 의미합니다. 하나의 고유 한 요소가 있거나 * 또는 * 요소가 5 회 이상 발생했습니다. 그것이 내가 코딩 한 것입니다. 틀린 것이면 질문을 명확히해야합니다. –

8

사용 collections.Counter() :

from collections import Counter 

def all_equal(lst, count): 
    return any(v >= count for v in Counter(lst).values()) 
3
Counter를 사용

짧은 답변 :

from collections import Counter 

def some_equal(lst): 
    return max(Counter(lst).values()) >= 5 

Counter는이 요소의 계산 발행 수를 "설정"입니다 . Counter.keys()은 요소를 반환하고 Counter().values()은 발생 횟수를 반환합니다. 따라서이 max은 5 회 이상 발생하는 요소가 있음을 보장합니다.

+2

'max()'는 모든 값을 살펴볼 것입니다. => 5 첫 번째 값에서 멈춤. –

+0

@eugeney 음, 점근 적으로 복잡성은 동일합니다. :) –

2
당신이 어떤 값이 5이면 반복대로 단락을 가서 당신은 또한 확인할 수 있습니다

: 실제로 빠르게, 때로는

from collections import defaultdict 

def five(it): 
    d = defaultdict(int) 
    for ele in it: 
     d[ele] += 1 
     if d[ele] == 5: 
      return True 
    return False 

당신은 단지 defaultdict를 계산 카운터를 사용하지만에 수 빠른이며, .