我想比较多个对象并仅在所有对象彼此不相等时才返回True
。我尝试使用下面的代码,但它不起作用。如果obj1和obj3相等且obj2和obj3不相等,则结果为True
。
obj1 != obj2 != obj3
我有超过3个对象要比较。使用下面的代码是不可能的:
all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
答案 0 :(得分:20)
>>> 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
答案 1 :(得分:18)
如果对象都是可散列的,那么您可以看到对象序列的frozenset
长度是否与序列本身相同:
def all_different(objs):
return len(frozenset(objs)) == len(objs)
示例:
>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
答案 2 :(得分:6)
如果对象不可删除但可订购(例如,列表),那么您可以通过排序将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))
答案 3 :(得分:4)
from itertools import combinations
all(x != y for x, y in combinations(objs, 2))
答案 4 :(得分:3)
您可以通过将列表转换为集合来检查列表中的所有项目是否都是唯一的。
my_obs = [obj1, obj2, obj3]
all_not_equal = len(set(my_obs)) == len(my_obs)