如何获取包含其他列表中相同项的列表索引?

2024-05-19 19:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表列表和另一个单独的列表,我需要检查第二个列表的项目是否在列表列表的任何列表中以相同的顺序,并返回这些子列表的索引

例如:

lst=[['ahmad','a',5],['ahmad','b',6],['ahmad','x',4],['Emme','b',5],['Emme','b',4]]

lst_2=['ahmad','b']lst_3= ['b','ahmad']

预期结果:

对于lstè2:

True
1

至于lst\ U 3:

False

我尝试了以下行来检查独立列表是否在嵌套列表中,但结果中没有考虑顺序:

any(set(lst_2) <= set(l) for l in lst)

True

any(set(lst_3) <= set(l) for l in lst)

True

Tags: 项目infalsetrue列表for顺序any
1条回答
网友
1楼 · 发布于 2024-05-19 19:28:56

使用set肯定不会保留顺序,因为集合是无序的

相反,我建议遍历该列表,并将子列表视为一个堆栈,每次有匹配项时都从中弹出一个元素。如果堆栈在任何时候都是空的,那么就得到一个有序的子列表

使用deque可以从O(1)中的sublst左边弹出

代码

from collections import deque

def is_ordered_sublist(sublst, lst):
    sublst = deque(sublst)
    for x in lst:
        if not sublst:
            # return True early if the stack is empty
            return True

        if x == sublst[0]:
            sublst.popleft()

    return not sublst

示例

print(is_ordered_sublist([1, 2, 3], [1, 9, 2, 9, 3, 9])) # True

print(is_ordered_sublist([1, 2, 3], [1, 9, 3, 9, 2, 9])) # False

恢复子列表索引

然后可以使用上面的函数和列表理解,并enumerate恢复相应的索引

lst=[['ahmad','a',5],['ahmad','b',6],['ahmad','x',4],['Emme','b',5],['Emme','b',4]]

lst_2=['ahmad','b']

indices = [i for i, l in enumerate(lst) if is_ordered_sublist(lst_2, l)]

print(indices) # [1]

相关问题 更多 >