9

我想比较多个对象并True仅在所有对象之间不相等时才返回。我尝试使用下面的代码,但它不起作用。如果 obj1 和 obj3 相等且 obj2 和 obj3 不相等,则结果为True

obj1 != obj2 != obj3

我有超过 3 个对象要比较。使用下面的代码是没有问题的:

all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
4

5 回答 5

21

如果对象都是可散列的,@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
于 2012-07-30T20:01:24.720 回答
18

如果对象都是可哈希的,那么您可以查看frozenset对象序列的 a 是否与序列本身具有相同的长度:

def all_different(objs):
    return len(frozenset(objs)) == len(objs)

例子:

>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
于 2012-07-30T19:59:23.600 回答
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))
于 2012-07-30T21:02:05.487 回答
4
from itertools import combinations
all(x != y for x, y in combinations(objs, 2))
于 2012-07-30T20:02:51.977 回答
3

您可以通过将列表转换为集合来检查列表中的所有项目是否唯一。

my_obs = [obj1, obj2, obj3]
all_not_equal = len(set(my_obs)) == len(my_obs)
于 2012-07-30T20:00:24.130 回答