1. ホーム
  2. python

[解決済み] リスト内のすべての要素が同一であるかどうかをチェックする

2022-03-20 18:38:36

質問

を取り込む関数が必要です。 list を出力し True 入力リストのすべての要素が標準の等号演算子で互いに等しいと評価され、かつ False でなければ

私は、隣接する要素を比較するリストを繰り返し実行するのが最善であると感じており、次に AND その結果得られたすべてのブール値。しかし、それを行うための最もPythonicな方法は何なのかわかりません。

どのように解決するのか?

使用方法 itertools.groupby (参照 その itertools レシピ ):

from itertools import groupby

def all_equal(iterable):
    g = groupby(iterable)
    return next(g, True) and not next(g, False)

または groupby :

def all_equal(iterator):
    iterator = iter(iterator)
    try:
        first = next(iterator)
    except StopIteration:
        return True
    return all(first == x for x in iterator)


代わりの一発芸はいくつもありますよ。

  1. 入力を集合に変換し、その集合が1個または0個(入力が空の場合)しか持たないことを確認する。

    def all_equal2(iterator):
        return len(set(iterator)) <= 1
    
    
  2. 最初の項目を除いた入力リストと比較する

    def all_equal3(lst):
        return lst[:-1] == lst[1:]
    
    
  3. 最初の項目がリスト内に何回現れるかを数える

    def all_equal_ivo(lst):
        return not lst or lst.count(lst[0]) == len(lst)
    
    
  4. 最初の要素が繰り返されるリストと比較する

    def all_equal_6502(lst):
        return not lst or [lst[0]]*len(lst) == lst
    
    

しかし、彼らには次のようなデメリットがあります。

  1. all_equalall_equal2 は任意のイテレータを使用できますが、他のものはシーケンス入力、通常はリストやタプルのような具体的なコンテナを取る必要があります。
  2. all_equalall_equal3 は、違いが見つかり次第、停止します(いわゆる " ショートサーキット であることが分かっても、リスト全体を反復する必要があります。 False 最初の2つの要素を見ただけで
  3. all_equal2 は、コンテンツが ハッシュ化 . リストのリストでは TypeError を例にとります。
  4. all_equal2 (最悪の場合)と all_equal_6502 はリストのコピーを作成します。つまり、2倍のメモリを使用する必要があります。

Python 3.9では perfplot の場合、このようなタイミングになります(下 Runtime [s] が良い)。