を受け取り、入力リスト内のすべての要素が標準の等価演算子を使用して互いに等しいと評価された場合に出力し、そうでない場合はlist
出力する関数が必要です。True
False
リストを反復処理して隣接する要素を比較し、結果のすべてのブール値を比較するのが最善だと思いますAND
。しかし、それを実行するための最も Python 的な方法が何であるかはわかりません。
ベストアンサー1
使用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つまたは0つの項目(入力が空の場合)のみが含まれていることを確認します。
def all_equal2(iterator): return len(set(iterator)) <= 1
最初の項目を除いた入力リストと比較する
def all_equal3(lst): return lst[:-1] == lst[1:]
-
def all_equal_ivo(lst): return not lst or lst.count(lst[0]) == len(lst)
-
def all_equal_6502(lst): return not lst or [lst[0]]*len(lst) == lst
しかし、次のような欠点もあります。
all_equal
およびはall_equal2
任意のイテレータを使用できますが、その他はシーケンス入力 (通常はリストやタプルなどの具体的なコンテナー) を受け取る必要があります。all_equal
all_equal3
違いが見つかったらすぐに停止します(「短絡False
") ですが、最初の 2 つの要素だけを見て答えがわかる場合でも、すべての選択肢ではリスト全体を反復処理する必要があります。all_equal2
コンテンツにはハッシュ可能リストのリストは、TypeError
たとえば を発生させます。all_equal2
(最悪の場合)all_equal_6502
リストのコピーが作成されるため、メモリを 2 倍使用する必要があります。
Python 3.9では、perfplot
すると、次のタイミングが得られます (低いほどRuntime [s]
良い)。