首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:确定序列中的任何项是否等于任何其他项

Python:确定序列中的任何项是否等于任何其他项
EN

Stack Overflow用户
提问于 2012-07-31 03:56:53
回答 5查看 539关注 0票数 9

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

代码语言:javascript
运行
复制
obj1 != obj2 != obj3

我有3个以上的对象要比较。使用下面的代码是不可能的:

代码语言:javascript
运行
复制
all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-31 04:01:25

@Michael Hoffman的答案是好的,如果对象都是hashable的。如果没有,您可以使用itertools.combinations

代码语言:javascript
运行
复制
>>> 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
票数 21
EN

Stack Overflow用户

发布于 2012-07-31 03:59:24

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

代码语言:javascript
运行
复制
def all_different(objs):
    return len(frozenset(objs)) == len(objs)

示例:

代码语言:javascript
运行
复制
>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
票数 18
EN

Stack Overflow用户

发布于 2012-07-31 05:02:05

如果对象是不可散列但可排序的(例如,列表),则可以通过排序将itertools解决方案从O(n^2)转换为O( n ):

代码语言:javascript
运行
复制
def all_different(*objs):
    s = sorted(objs)
    return all(x != y for x, y in zip(s[:-1], s[1:]))

下面是一个完整的实现:

代码语言:javascript
运行
复制
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))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11728662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档