如何检查列表中是否存在元组?

6
为什么会出现这个:


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

如何检查序列中是否存在元组或其他通用序列,但没有特定的值,就像这个答案中所述,如果返回False该怎么办?


3
列表是否可以任意嵌套?还是像你的示例中那样只是扁平的? - Brad Solomon
1
你正在检查列表中是否存在一个空元组。你可以检查类型而不是这样做。 - Sid
你为什么认为那会起作用?真的,我不明白是什么让你觉得那可能会起作用。这似乎不仅仅是一个瞎猜,因为你似乎对它不起作用感到困惑。是什么思维过程让你认为它可能会做你想要的事情?如果你发现自己对这种事情感到困惑,你应该在发布之前问问自己这个问题,并有一个答案。如果你这样做,你经常会发现有些东西你认为是正确的,但实际上并不确定,如果你去核实,那么你可能根本不需要发布。 - jpmc26
2个回答

28

() 是一个空元组。 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 的虚拟子类。

有关更多信息,请阅读这个优秀答案

您可以在此处找到有关检测序列的问题。


我相信abc.Iterable在这里也很有用。 - cat
2
很遗憾,实际上并不是这样。我在这里详细说明了为什么检查 abc.Iterable 是不可靠的链接 - timgeb
好奇:any()函数是否贪婪地运行,停在第一个True出现的位置? - Brad Solomon
@BradSolomon 是的,any 是延迟执行的。 - timgeb

3

您要检查的是列表中是否存在空元组。

相反,您可以检查其类型。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接