Python: determining whether any item in sequence i

2020-03-01 18:19发布

I'd like to compare multiple objects and return True only if all objects are not equal among themselves. I tried using the code below, but it doesn't work. If obj1 and obj3 are equal and obj2 and obj3 are not equal, the result is True.

obj1 != obj2 != obj3

I have more than 3 objects to compare. Using the code below is out of question:

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

5条回答
贪生不怕死
2楼-- · 2020-03-01 19:00

You can check that all of the items in a list are unique by converting it to a set.

my_obs = [obj1, obj2, obj3]
all_not_equal = len(set(my_obs)) == len(my_obs)
查看更多
爷、活的狠高调
3楼-- · 2020-03-01 19:09

If the objects are unhashable but orderable (for example, lists) then you can transform the itertools solution from O(n^2) to O(n log n) by sorting:

def all_different(*objs):
    s = sorted(objs)
    return all(x != y for x, y in zip(s[:-1], s[1:]))

Here's a full implementation:

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))
查看更多
劳资没心,怎么记你
4楼-- · 2020-03-01 19:11
from itertools import combinations
all(x != y for x, y in combinations(objs, 2))
查看更多
Rolldiameter
5楼-- · 2020-03-01 19:17

@Michael Hoffman's answer is good if the objects are all hashable. If not, you can use 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
查看更多
够拽才男人
6楼-- · 2020-03-01 19:17

If the objects are all hashable, then you can see whether a frozenset of the sequence of objects has the same length as the sequence itself:

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

Example:

>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
查看更多
登录 后发表回答