切片python列表

时间:2015-04-07 16:52:15

标签: python list

我有一个python列表如下:

>>>list1 = ['Mary','had','a','little','lamb','which','was','very','naughty']

现在我想创建一个创建子列表,其子元素从非常。所以我做了以下事情:

>>> list1[list1.index('little'):list1.index('very')+1]
['little', 'lamb', 'which', 'was', 'very']

我想要做的不是指定整个元素,而是使用 in 函数检查元素中的子字符串,然后将列表切片为:

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

我该怎么做?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Enumerate是你的朋友。通过它和列表推导,它变得非常容易。

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]

此代码的作用是仅在元素包含字符串时才使用元素,但存储索引而不是元素。为开始和结束执行此操作,并使用第一个匹配项提供所需的结果。

答案 2 :(得分:0)

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

>>> 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']

答案 3 :(得分:0)

这可能不是您正在寻找的答案(特别是采用行数)。但我想展示不同的方法(特别是如果你是Python的新手):

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)    

这里有几个问题:

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