我试图在两个给定的索引之间找到所有的项。我有这样的清单:
mylist = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT','GONOW','MAKE','COMMENT', 'YES','COMMENT']
我希望输出显示如下:注释:下面的输出是两个‘注释’之间的索引值。
First output : 'YES', 'YES', 'NO', '123'
second output : 'GONOW','MAKE'
third output : 'YES'
我有两个想法来处理这种情况: 1)如果我知道search_string是‘注释’,那么我应该能够在两个已知字符串之间找到所有东西,如下所示:
string = 'COMMENT'
find_values = mylist[findfirst(comment)-findsecond(comment)]
find_values = mylist[findsecond(comment)-findthird(comment)]
2)如果我知道所有‘注释’的索引,那么我应该能够在两个已知的索引之间创建find_all,如下所示:
idx1_comment = 1
idx2_comment = 6
idx3_comment = 9
print mylist(range(2-5))
print mylist(range(6-8))
有什么想法吗?
谢谢..。
另外,我还有一个请求。对于#1选项,如果我有列表,在字符串‘注释’和‘边框’之间有很多项,那么还有什么方法呢?
顺便说一句,我试着看了这篇文章,但没有任何好处。Python:从两个已知项之间的列表中获取项
发布于 2018-03-17 11:33:19
您可以在迭代工具上利用海岛:
from itertools import islice
mylist = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT','GONOW','MAKE','COMMENT', 'YES','COMMENT']
# get indexes of all 'COMMENT'
idx = [i for i,v in enumerate(mylist) if v in [ 'COMMENT']]
print(idx)
# calculate tuples of data we are interested in:
# ( commentIdx+1 , next commentIdx ) for all found ones
idx2 = [ (idx[i]+1,idx[i+1]) for i in range(len(idx)-1)]
print(idx2)
# slice the data out of our list and create lists of the slices
result = [ list(islice(mylist,a,b)) for a,b in idx2]
print(result)
输出:
[1, 6, 9, 11] # indexes of 'COMMENT'
[(2, 6), (7, 9), (10, 11)] # Commentindex +1 + the next one as tuple
[['YES', 'YES', 'NO', '123'], ['GONOW', 'MAKE'], ['YES']]
您也可以跳过idx2
result = [ list(islice(mylist,a,b)) for a,b in ((idx[i]+1,idx[i+1]) for i in range(len(idx)-1))]
至于你的第二个问题--这个问题可能应该由你自己解决,或者作为单独的问题发布:
这取决于数据--它们是否混合(C = COMMENT, B = BORDER
)?
[ C, 1, 2 , C , 3 , B , 4 , B, 5, C ]
最好是自己试一试,或者用样本数据和想要的输出发布一个新的问题。上面的可能是
[ [1,2],[3],[4] ]
或[ [1,2],[3],[3,4,5],[4,5],[5]
或介于两者之间的东西-第一种使用严格的C和B,而不是C或B匹配。后者允许C-B和B-C以及C-.-C忽略/删除介于B之间的B
发布于 2018-03-17 11:12:03
为什么不简单地迭代列表一次:
result = []
sublist = []
separators = ('COMMENT', 'BORDER')
mylist = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT','GONOW','MAKE','COMMENT', 'YES','COMMENT', 'BORDER', 'FOO', '123']
for x in mylist:
if x in separators:
if sublist:
result.append(sublist)
sublist = []
else:
sublist.append(x)
result.append(sublist)
print (result)
返回:
[['ABC'], ['YES', 'YES', 'NO', '123'], ['GONOW', 'MAKE'], ['YES'], ['FOO', '123']]
发布于 2018-03-17 11:14:50
如果您只想过滤出两个预定义字符串之间的字符串,那么下面的代码就可以了:
def filter_output_between_strings(input: [str], separator: str):
separator_indexes = [index for index, word in enumerate(input) if word == separator]
for example_index, (start, end) in enumerate(zip(separator_indexes[:-1], separator_indexes[1:]), start=1):
print('Example: {}: {}'.format(example_index, input[start + 1:end]))
if __name__ == '__main__':
input = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT', 'GONOW', 'MAKE', 'COMMENT', 'YES', 'COMMENT']
filter_output_between_strings(input, 'COMMENT')
输出:
Example: 1: ['YES', 'YES', 'NO', '123']
Example: 2: ['GONOW', 'MAKE']
Example: 3: ['YES']
https://stackoverflow.com/questions/49335177
复制相似问题