Python:确定顺序中的任何项是否与任何其他项相同

msa*_*aio 9 python comparison

我想比较多个对象,True只有当所有对象彼此不相等时才返回.我尝试使用下面的代码,但它不起作用.如果obj1和obj3相等且obj2和obj3不相等,则结果为True.

obj1 != obj2 != obj3
Run Code Online (Sandbox Code Playgroud)

我有超过3个对象要比较.使用下面的代码是不可能的:

all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 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
Run Code Online (Sandbox Code Playgroud)


Mic*_*man 18

如果对象都是可散列的,那么您可以看到frozenset对象序列中的一个是否与序列本身具有相同的长度:

def all_different(objs):
    return len(frozenset(objs)) == len(objs)
Run Code Online (Sandbox Code Playgroud)

例:

>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
Run Code Online (Sandbox Code Playgroud)

  • 为什么冷冻集而不是设置? (2认同)
  • 你的函数不会更好地命名为`all_different`吗? (2认同)

eca*_*mur 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:]))
Run Code Online (Sandbox Code Playgroud)

这是一个完整的实现:

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))
Run Code Online (Sandbox Code Playgroud)