Python:如何找出元组的子元组是否在元组中?

4
例如,一个元组是(1,0,1,1,1,0),其中子元组是(1,0)。
如何按升序查找子元组是否在元组中?
只能使用迭代逐个比较吗?
例如: (1,0,1,1,1,0) = (1,0, *, *, *, *) 因此,子元组(1,0)在元组中!
注意:我不需要知道(1,0)在(1,0,1,1,1,0)中,如下所示: (1,0,1,1,1,0) = ( *, *, *, *, 1,0),因此(1,0)在(1,0,1,1,1,0)中...=>这是错误的。

你似乎知道如何做。那么你的问题到底是什么?你担心效率吗?你希望找到更简洁的代码吗?无论哪种方式,请分享你的代码... - Julien
2个回答

6
内置序列类型的文档说明in操作可以进行子序列检查,但只适用于某些类型:
注: 1. 虽然在一般情况下,innot in操作仅用于简单的包含测试,但某些特定序列(例如str、bytes和bytearray)也用它们进行子序列测试。 例如:>>> "gg" in "eggs" True 因此,如果您的数据仅为0到255之间的整数,则可以转换为字节进行检查: >>>bytes((1,0)) in bytes((1,0,1,1,1,0)) True 对于其他类型的数据,这个表达式是迭代的一行方式:

A = ('L', 'R') B = ('L', 'R', 'L', 'L', 'L', 'R') 任意(B[i:len(A) + i] == A for i in range(len(B) - len(A) + 1)) 真

...虽然用for循环写可能更易读。


这些方法会捕获第二个元组中出现的 (1, 0),因此您标记为错误的示例将被匹配。如果您只想匹配第一个元组是否以第二个元组的第一个条目开头,则可以切片并进行比较:

>>> A = (1, 0)

>>> B = (1, 0, 1, 1, 1, 0)

>>> A == B[:len(A)]

True


1
main_tuple = (1, 2, 3, 4, 5)
subtuple = (1, 2)

if set(subtuple) <= set(main_tuple):
    print('subtuple is part of the main tuple')

看,你需要将元组转换为集合。如果保持元组结构,它不起作用。 有了一个集合,你需要检查你的子元组是否小于或等于你的主元组。

MAIN_TUPLE = (1, 2, 3, 4, 5)

A = (1, 2)  # Is a subtuple
B = (5, 3, 2)  # Is a subtuple
C = (6, 7)  # No
D = (1, 8) # No

2
这个方法会将(2,1)报告为在(1,2,3,4,5)中。在OP的例子中,顺序很重要。 - Autumn

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