2016-07-10 28 views
3

現在このコードを持っていますが、配列内のすべての要素が同じかどうかを確認します。このような場合は、trueを返す少なくとも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] 

がTrue aswellを返すように。 5回あるので1

答えて

7

セットを使用する代わりにbag or multiset typeを使用してください。マルチセットは、ユニークな値が何回発生するかをカウントします。

collections.Counter() objectだPythonで

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:あなたの質問は、2つの条件に対して真を返すことを意味します:1つの固有の要素、*または*要素の少なくとも5つの出現があります。それは私がコード化したものです、それが間違っているなら、あなたはあなたの質問を明確にする必要があります。 –

8

使用collections.Counter()

Counterを使用して
from collections import Counter 

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

短い答え:

from collections import Counter 

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

Counterは、その要素の "設定" カウント発生箇所であります。 Counter.keys()は要素を返し、Counter().values()はそれらの発生数を返します。したがって、このmaxは5回以上発生する要素があることを保証します。

また、あなたは行くように任意の値が5である場合は反復として、短絡をチェックすることができ
+2

'max()'はすべての値を調べます。最初の値> = 5で停止してください。 –

+0

@eugeneyまあ、漸近的に複雑です:) –

2

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をカウントすることは早く、時には実際に高速である可能性があり。

関連する問題