True
複数のオブジェクトを比較して、すべてのオブジェクトが等しくない場合にのみ返したいのですが。以下のコードを使用してみましたが、機能しません。obj1とobj3が等しく、obj2とobj3が等しくない場合、結果はになりTrue
ます。
obj1 != obj2 != obj3
比較するオブジェクトが3つ以上あります。以下のコードを使用することは問題外です:
all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
True
複数のオブジェクトを比較して、すべてのオブジェクトが等しくない場合にのみ返したいのですが。以下のコードを使用してみましたが、機能しません。obj1とobj3が等しく、obj2とobj3が等しくない場合、結果はになりTrue
ます。
obj1 != obj2 != obj3
比較するオブジェクトが3つ以上あります。以下のコードを使用することは問題外です:
all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
オブジェクトがすべてハッシュ可能であれば、@Michael Hoffmanの答えは良いです。そうでない場合は、itertools.combinationsを使用できます。
>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd', 'a'], 2))
False
>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd'], 2))
True
オブジェクトがすべてハッシュ可能である場合、オブジェクトfrozenset
のシーケンスの がシーケンス自体と同じ長さであるかどうかを確認できます。
def all_different(objs):
return len(frozenset(objs)) == len(objs)
例:
>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
オブジェクトがハッシュ化できないが順序付け可能である場合(たとえば、リスト)、次のようitertools
に並べ替えることで、ソリューションをO(n ^ 2)からO(n log n)に変換できます。
def all_different(*objs):
s = sorted(objs)
return all(x != y for x, y in zip(s[:-1], s[1:]))
完全な実装は次のとおりです。
def all_different(*objs):
try:
return len(frozenset(objs)) == len(objs)
except TypeError:
try:
s = sorted(objs)
return all(x != y for x, y in zip(s[:-1], s[1:]))
except TypeError:
return all(x != y for x, y in itertools.combinations(objs, 2))
from itertools import combinations
all(x != y for x, y in combinations(objs, 2))
リストをセットに変換することで、リスト内のすべてのアイテムが一意であることを確認できます。
my_obs = [obj1, obj2, obj3]
all_not_equal = len(set(my_obs)) == len(my_obs)