Python:如何检查带有重复值的列表是否是另一个列表的子列表

3

例子:

lista = ['p','o','o','p']
listb = ['p','o','o','h','a','b','c']

如果我使用issubset方法,结果会是True。然而事实上lista不是listb的子集。 顺便说一下,我在使用Python编程。 为了澄清,代码必须在这种情况下工作:
lista = ['p','o','o','p']
listb = ['p','o','o','h','p','b','c']

以上内容应该返回 true。

不过,

lista = ['p','o','o','p']
listb = ['p','o','h','p','b','c']

上述内容是错误的。 第一个例子也是错误的。

2
你对子列表的定义是什么?应该考虑顺序还是只计算值的数量? - luigigi
不考虑顺序,只考虑值和数量。例如,如果子列表为'poop',它有两个P和两个O,则主列表也应该有两个P和两个O,才能返回True的结果。 - Anne B
4个回答

2

您可以将列表加入字符串,并检查一个是否是另一个的一部分:

lista = ['p','o','o','p']
listb = ['p','o','o','h','a','b','c']
''.join(lista) in ''.join(listb)
False


lista = ['p','o','o','p']
listb = ['p','o','o','p','h','a','b','c']
''.join(lista) in ''.join(listb)
True

我从未考虑过将列表视为字符串进行比较。不错! :) - dimasdmm
2
如果listb是['p','o','o','h','p'],那么这将失败。 - Gaurav Agarwal
1
@GauravAgarwal 因为作者从未说明他对子列表的定义,所以不清楚这是否是一个问题。 - luigigi
@GauravAgarwal 是的,这将是一个问题。 - Anne B
如果字符串的长度超过1,这种方法将会失败,这并不是一个解决方案。 - Kodeeo

1

一行代码:

any([lista==listb[i:i+len(lista)] for i in range(len(listb)-len(lista)+1)])

当我有这个测试用例:lista = ['p','o','o','p'] listb = ['p','o','o','h','p','b','c']时,它就无法工作。 - Anne B
对于该输入,它返回 False。如果您更改 lista = ['p','o','o','h'],则会按预期返回 True - rpoleski

1

我怀疑你无法通过直接比较在少于O(N)的时间内完成它。

这是一个选项:

def issublist(list_a, list_b):
    for i in range(len(list_b)-len(list_a)):
        if list_a == list_b[i:len(list_a)+i]:
            return True
    return False


如果需要重复不同的子列表搜索,则可以通过首先对listb进行索引来更快地完成。 - rpoleski

0

试试这个:

def removeElements(a, b): 
    n = len(a) 
    return any(a == b[i:i + n] for i in range(len(b)- n + 1)) 

print(removeElements(a, b))

抱歉,我已经编辑过了。现在它可以工作了。你需要先将你的列表转换为集合。 - Yana
好的,这个编辑应该可以工作了。在你的情况下它返回false,正如它应该的那样。如果我在第二个“p”的位置写入“h”,它将返回true。现在可以了吗? - Yana

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