リストがPythonの数学セットであるかどうかを確認するための最速の\最もpythonicな方法は何ですか?
私は次の作品を知っています:
ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
これを確認するためのより良い/より速い方法はありますか?
リストがPythonの数学セットであるかどうかを確認するための最速の\最もpythonicな方法は何ですか?
私は次の作品を知っています:
ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
これを確認するためのより良い/より速い方法はありますか?
通常は高速になるわけではありませんが、値がハッシュ可能ではなくても比較可能であり、特に既にソートされている場合は、要素が一意でないかどうかを遅延して判断できます。
def is_unique(items, key=None):
for k, g in itertools.groupby(sorted(items, key=key), key=key):
if len(list(itertools.islice(g, 2))) > 1:
return False
return True
これは、最初の重複が検出され、必要以上のチェックが行われなくなるとすぐに停止します。これにより、より高速に実行される可能性があります (特に、「入力が既にソートされている」場合)。set
これを行うことにより、一意性がすぐに侵害された場合にハッシュおよび保存される要素の数を最小限に抑えるために、次のように反復することにより、同様のアーリーアウトベースのアプローチを作成できます( のunique_everseen
レシピから適応itertools
)。
def is_unique(iterable):
seen = set()
seen_add = seen.add
for element in iterable:
if element in seen:
return False
seen_add(element)
return True
注: 一意性が一般的である少数のハッシュ可能な入力の典型的なケース (または、少なくとも、入力セットの早い段階で違反されていない) では、上記のソリューションのどちらも優れていません。あなたが提供した単純な解決策は簡潔で明白であり、CPython の C レイヤーでほとんどの作業を実行するため、多くの Python コードを実行するメソッドと比較して、固定オーバーヘッドがはるかに低くなります。しかし、これらは、大きな入力、既にソートされた入力、および/または一意性が一般的でない入力には役立つ場合があります (したがって、アーリーアウト動作により、作業が節約されます)。