我想与python进行一个复杂的列表比较.我想看看listB是否包含listA中的所有项目,以及它们的顺序是否相同.但我不在乎listB是否有额外的项目或交叉项目.

示例:

listA = ['A','B','C','D','E']
listB = [':','A','*','B','C','D','E','`']

ABCDE都出现在listB中,并且以相同的顺序显示,即使AB之间有一个项目,并且项目在listB的开头和结尾.

特别复杂:

listA = ['A','B','C','D','E']
listB = ['A','*','C','B','C','D','E']

ABCDE都出现在listB中,并以相同的顺序显示,尽管AB之间有两个项目,其中一个项目恰好是我们正在搜索的项目.但由于我们正在寻找如果A->B是顺序的,B->C是一个连续的事实,我们也有C->B->C应该没关系.

所以

listA = ['A','B','C','D','E']
listB = [':','A','*','B','C','D','E','`']

是真的

listA = ['A','B','C','D','E']
listB = ['A','*','C','B','C','D','E']

是真的

但有点像:

listA = ['A','B','C','D','E']
listB = ['A','B','C','D','F']

甚至

listB = ['A','B','C','D']

将是错误的

如果得到的是错误的答案,我希望能够指出序列中断发生的位置,即E is missing.

推荐答案

使用嵌套循环的简单解决方案.浏览listA并按顺序搜索listB中的元素.如果您在任何时候都失败了->;这不是子字符串:


def check(listA, listB):
    start = 0
    for a in listA:
        for i in range(start, len(listB)):
            if a == listB[i]:
                start = i+1
                break
        else:  # triggered only if no break
            # print(f'{a} not found after position {start}')
            return False
    return True

check('ABCDE', 'A*CBCDE')
# True

check('ABCDEF', 'A*CBCDE')
# False

check ('', '')
# True

check('ABA', 'ABBA')
# True

NB. Using strings here for clarity, but this works for any iterable.

要获取有关未找到项的信息,可以取消注释print.

例子:

check('ABCA', 'ABBA')

C not found after position 2
# False

Python相关问答推荐

Flask Jinja2如果语句总是计算为false&

如何在Gekko中使用分层条件约束

递归函数修饰器

提取数组每行的非零元素

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

多个矩阵的张量积

极点替换值大于组内另一个极点数据帧的最大值

以极轴表示的行数表达式?

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

仅取消堆叠最后三列

将像素信息写入文件并读取该文件

如何从一个维基页面中抓取和存储多个表格?

使用Scikit的ValueError-了解

检测并显示网页更改

有没有更python的方法来复制python中列表的第n个元素?例如,使用列表理解

数字巨 Python S列表与Pandas 数据帧的比较

Django URL中不需要的空格

在Pandas 数据帧中使用GROUPBY()应用FIND_PEAKS()函数

FlaskApp无法在Google Cloud Run上运行:服务不可用503错误

Django-如何通过两个相同的字段进行筛选或排除?