我有一个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]
我该怎么做?
答案 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)
这里有几个问题: