切片python列表

切片python列表,python,list,Python,List,我有一个python列表,如下所示: >>>list1 = ['Mary','had','a','little','lamb','which','was','very','naughty'] 现在我想创建一个包含从little到very元素的子列表。因此,我做了以下工作: >>> list1[list1.index('little'):list1.index('very')+1] ['little', 'lamb', 'which', 'was', 'ver

我有一个python列表,如下所示:

>>>list1 = ['Mary','had','a','little','lamb','which','was','very','naughty']
现在我想创建一个包含从littlevery元素的子列表。因此,我做了以下工作:

>>> list1[list1.index('little'):list1.index('very')+1]
['little', 'lamb', 'which', 'was', 'very']
我想做的不是指定整个元素,而是使用in函数检查元素中的子字符串,然后对列表进行切片,如下所示:

>>> list1[list1.index('lit'):list1.index('ver')+1]

我该怎么做?

正如我在前面的回答中所说的,您不需要使用
list.index
方法,您可以使用以下更快的函数,也可以对元素应用任何计算:

def drop(iterable,start,end):

    for i,x in enumerate(iterable):
        if x==start :
            for y in iterable[i:]:
                if y!=end and 'sub_string' in y: #or 'sub_string' not in y
                    yield y
                else:
                    #based on your problem do stuff
                    #yield end
                    break
他是你的朋友。有了这些和列表理解,它变得非常简单

list1[[i for i, j in enumerate(list1) if "lit" in j][0]:[i for i, j in enumerate(list1) if "ver" in j][0]+1]

这段代码所做的是,它只在包含字符串时接受元素,但存储索引而不是元素。对开始和结束执行此操作,并使用第一个匹配项可以得到所需的结果。

为了保持可读性,您需要将其分解为多个语句,而不是使用大列表:

>>> list1 = ['Mary','had','a','little','lamb','which','was','very','naughty']
>>> first = next(i for i, v in enumerate(list1) if 'lit' in v)
>>> last = next(i for i, v in enumerate(list1) if 'ver' in v)
>>> list1[first:last+1]
['little', 'lamb', 'which', 'was', 'very']

这可能不是你想要的答案(尤其是考虑行数)。但我想展示不同的方法(特别是如果您是Python新手):

这里有几个问题:

  • fuzzyFilter只能使用一次(或者需要某种重置)
  • 可以保证,整个列表1都会被读取(在其他答案中并不总是如此)

@kasra..谢谢你的建议..我理解你的观点..但我还是Python新手,正在尝试学习所有的技巧,并特别寻找一种使用索引的方法..@Amistad欢迎您,但作为初学者,您需要学习Python解决问题的方法!我尝试了很多组合,所有其他解决方案都会根据元素的位置而改变。这是唯一有效的解决方案,因为它的实现方式。将此标记为正确答案。@Amistad对此我很高兴!;)
class fuzzyFilter:
    def __init__(startSubstr, endSubstr):
        self.start = startSubstr
        self.end = endSubstr
        self.state = None

    def __call__(value):
        if self.state is None:
            if self.start in value:
                self.state = True
                return True
        elif self.state:
            if self.end in value:
                self.state = False
            return True
        return False

print filter(fuzzyFilter('lit', 'very'), list1)