【问题标题】:Find starting and ending indices of sublist in list在列表中查找子列表的开始和结束索引
【发布时间】:2022-01-10 03:58:27
【问题描述】:

我有一个清单:

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

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

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

应该返回:

1, 3

建议?

【问题讨论】:

标签: python list search sublist


【解决方案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】:

    如果你想要多个匹配,这可行:

    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)
    

    【讨论】:

      【解决方案3】:

      如果您确定您的列表将始终在您的子列表中,您可以这样做:

      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
      

      最后,如果 sub_list 中项目的顺序也是未知的,那么使用这个:

      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。

      【讨论】:

      • 你的第一个例子不适用于find_sub_list('ab', 'acab')
      【解决方案4】:

      如果只返回第一个和最后一个条目的索引,则以下是一种解决方案:

      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]
      

      【讨论】:

        猜你喜欢
        • 2012-01-18
        • 2018-06-13
        • 2021-11-02
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多