如何检查列表中是不是有元组?

Posted

技术标签:

【中文标题】如何检查列表中是不是有元组?【英文标题】:How to check if there's a tuple inside a list?如何检查列表中是否有元组? 【发布时间】:2018-10-29 12:58:02 【问题描述】:

为什么会这样:

seq = [(1, 2), (3, 4), (5, 6)]
print(() in seq)

返回False?如何检查在没有特定值的序列中是否存在元组,甚至是通用序列,as in this answer。

【问题讨论】:

列表会被任意嵌套吗?还是像你的例子一样平坦? 您正在检查的是列表中是否存在一个空元组。您可以改为检查类型。 你为什么期望它会起作用?真的。我不明白是什么让你认为这可能有效。这似乎不仅仅是一个疯狂的猜测,因为您似乎对它不起作用的事实感到困惑。是什么思维过程让你认为它可以做你想做的事?如果您发现自己对这类事情感到困惑,您应该在发帖前问自己这个问题并得到答案。如果你这样做了,你经常会发现有些事情你认为是真的,但实际上并不确定,如果你去检查,那么你可能甚至不需要发布。 【参考方案1】:

() 是一个空元组。 seq 不包含空元组。

你想要

>>> seq = [(1, 2), (3, 4), (5, 6)]
>>> any(isinstance(x, tuple) for x in seq)
True

对于通用序列,您可以使用

>>> from collections import abc
>>> any(isinstance(x, abc.Sequence) for x in seq)
True

但是,许多对象被非正式地视为序列,但既没有实现完整的协议 abc.Sequence 定义,也没有注册为 Sequence 的虚拟子类。

阅读this excellent answer了解更多信息。

你可以找到一个关于检测序列的问题here。

【讨论】:

我相信abc.Iterable在这里也有用 @cat 不幸的是,并非如此。我详细写了为什么检查abc.Iterable 是不可靠的here。 好奇:any() 是否贪婪地运行,一开始就停止True-你的出现? @BradSolomon 是的,any 很懒惰。【参考方案2】:

您正在检查的是列表中是否存在一个空元组。

您可以改为检查类型。

def has_tuple(seq):    
    for i in seq:
        if isinstance(i, tuple):
            return True
    return False

【讨论】:

@timgeb 我故意提供伪代码来鼓励 OP 自己实现它。 如果您不喜欢编辑,我很抱歉。随意回滚。

以上是关于如何检查列表中是不是有元组?的主要内容,如果未能解决你的问题,请参考以下文章

6 元组和集合类型(赋值补充)

如何检查对象是列表还是元组(但不是字符串)?

从元组列表中返回具有最小 y 值的元组

检查元组列表中的所有第一个元素是不是满足条件

检查元组是不是出现在元组列表中时出现ValueError

第6天数据类型之元组,字典,集合