首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:从两个已知字符串或索引之间的列表中获取所有项

Python:从两个已知字符串或索引之间的列表中获取所有项
EN

Stack Overflow用户
提问于 2018-03-17 10:57:16
回答 3查看 4K关注 0票数 0

我试图在两个给定的索引之间找到所有的项。我有这样的清单:

代码语言:javascript
运行
复制
mylist = ['ABC', 'COMMENT', 'YES', 'YES', 'NO', '123', 'COMMENT','GONOW','MAKE','COMMENT', 'YES','COMMENT']

我希望输出显示如下:注释:下面的输出是两个‘注释’之间的索引值。

代码语言:javascript
运行
复制
First output  :  'YES', 'YES', 'NO', '123'
second output :  'GONOW','MAKE'
third output  :  'YES'

我有两个想法来处理这种情况: 1)如果我知道search_string是‘注释’,那么我应该能够在两个已知字符串之间找到所有东西,如下所示:

代码语言:javascript
运行
复制
string = 'COMMENT'
find_values = mylist[findfirst(comment)-findsecond(comment)]
find_values = mylist[findsecond(comment)-findthird(comment)]

2)如果我知道所有‘注释’的索引,那么我应该能够在两个已知的索引之间创建find_all,如下所示:

代码语言:javascript
运行
复制
idx1_comment = 1
idx2_comment = 6
idx3_comment = 9

print mylist(range(2-5))
print mylist(range(6-8))

有什么想法吗?

谢谢..。

另外,我还有一个请求。对于#1选项,如果我有列表,在字符串‘注释’和‘边框’之间有很多项,那么还有什么方法呢?

顺便说一句,我试着看了这篇文章,但没有任何好处。Python:从两个已知项之间的列表中获取项

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-17 11:33:19

您可以在迭代工具上利用海岛

代码语言:javascript
运行
复制
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) 

输出:

代码语言:javascript
运行
复制
[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

代码语言:javascript
运行
复制
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)?

代码语言:javascript
运行
复制
[ 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

票数 0
EN

Stack Overflow用户

发布于 2018-03-17 11:12:03

为什么不简单地迭代列表一次:

代码语言:javascript
运行
复制
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)

返回:

代码语言:javascript
运行
复制
[['ABC'], ['YES', 'YES', 'NO', '123'], ['GONOW', 'MAKE'], ['YES'], ['FOO', '123']]
票数 2
EN

Stack Overflow用户

发布于 2018-03-17 11:14:50

如果您只想过滤出两个预定义字符串之间的字符串,那么下面的代码就可以了:

代码语言:javascript
运行
复制
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')

输出:

代码语言:javascript
运行
复制
Example: 1: ['YES', 'YES', 'NO', '123']
Example: 2: ['GONOW', 'MAKE']
Example: 3: ['YES']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49335177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档