在列表中查找子列表的起始和结束索引

16
  • Item 1
  • Item 2
  • Item 3
greeting = ['hello','my','name','is','bob','how','are','you']

我想定义一个函数,用于查找此列表中子列表的第一个和最后一个索引。因此:

find_sub_list(['my','name','is'], greeting)

应该返回:

1, 3

有建议吗?


2
列表项是否总是连续的?['my','is','how'] 作为输入是否可接受?这应该返回 [1,5] - misguided
这个回答是否解决了你的问题?Python/NumPy子数组的第一个出现 - Idea O.
4个回答

24

如果您想要多个匹配项,可以这样做:

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is']

def find_sub_list(sl,l):
    results=[]
    sll=len(sl)
    for ind in (i for i,e in enumerate(l) if e==sl[0]):
        if l[ind:ind+sll]==sl:
            results.append((ind,ind+sll-1))

    return results

print find_sub_list(['my','name','is'], greeting) 
# [(1, 3), (8, 10)]

或者如果你只想要第一个匹配项:

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is']

def find_sub_list(sl,l):
    sll=len(sl)
    for ind in (i for i,e in enumerate(l) if e==sl[0]):
        if l[ind:ind+sll]==sl:
            return ind,ind+sll-1

print find_sub_list(['my','name','is'], greeting)    
# (1, 3)

-1

对列表进行切片:

>>> greeting[0:3]
['hello', 'my', 'name']
>>> greeting[1:4]
['my', 'name', 'is']
>>> greeting[1:4] == ['my','name','is']
True

这应该能让你开始了:

for n in range(len(greeting) - len(sub_list) + 1):
    ...

-2
以下是解决方案,仅返回第一个和最后一个条目的索引:
def find_sub_list(subl, l):
    ind_subl = [i for i in range(len(l)) if l[i] in subl]
    return [ind_subl[0], ind_subl[-1]]

print find_sub_list(['my', 'name', 'is'], greeting)
# [1, 3]

-2

如果你确信你的列表总是会在你的子列表中,你可以直接这样做:

def find_sub_list(sub_list,this_list):
    return (this_list.index(sub_list[0]),len(sub_list))

如果你想要检查子列表中的项目是否存在于列表中,请使用以下代码:
def find_sub_list(sub_list,this_list):
    if set(sub_list).issubset(set(this_list)): 
        return(this_list.index(sub_list[0]),len(sub_list))
    else:
        return False

最后,如果子列表中的项目顺序也是未知的,则使用以下代码:
def find_sub_list(sub_list,this_list):
    if sub_list[0] in this_list:
        for i,item in enumerate(sub_list[1:]):
            if item not in this_list[this_list.index(sub_list[i]):]:
                return False
        return(this_list.index(sub_list[0]),len(sub_list))

现在,项目必须按正确的顺序排列,以使函数不返回 false。


1
你的第一个例子对于 find_sub_list('ab', 'acab') 是不起作用的。 - Björn Lindqvist

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