我试图找到两个给定索引之间的所有项目。 例如:我的列表看起来像这样:
mylist = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT','GONOW','MAKE','COMMENT', 'YES','COMMENT']
我希望输出显示如下: 注意:以下输出是两个' COMMENT'之间的索引值。
First output : 'YES', 'YES', 'NO', '123'
second output : 'GONOW','MAKE'
third output : 'YES'
我有两个想法来处理这种情况: 1)如果我知道search_string为' COMMENT'然后我应该能够找到两个已知字符串之间的所有内容,如下所示:
string = 'COMMENT'
find_values = mylist[findfirst(comment)-findsecond(comment)]
find_values = mylist[findsecond(comment)-findthird(comment)]
2)如果我知道所有' COMMENT'的索引。那么我应该能够在两个已知的索引之间找到find_all,如下所示:
idx1_comment = 1
idx2_comment = 6
idx3_comment = 9
print mylist(range(2-5))
print mylist(range(6-8))
有什么想法吗?
...谢谢
另外,我有另一个请求。 对于#1选项,如果我有列表,其中我在字符串之间有很多项目'评论'和边界'那么它的方式是什么呢?
顺便说一下,我试过这篇文章,但没有任何好处。 Python: get items from list between 2 known items
答案 0 :(得分:1)
为什么不简单地迭代列表一次:
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']]
答案 1 :(得分:1)
如果您只想过滤掉两个预定义字符串之间的字符串,则此代码将执行:
const members: CrewMember[] = data;
输出:
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')
答案 2 :(得分:0)
您可以在itertools上使用islice:
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-C和B-B,没有C-B或B-C匹配。后者允许C-B和B-C以及C -......- C忽略/删除B之间