Python 按项中的子字符串拆分列表并保留分隔符
这是输入:Python 按项中的子字符串拆分列表并保留分隔符,python,list,split,Python,List,Split,这是输入: [ '@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', 'Some_String', '@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', '@imp_Some_String', 'Some_String', 'Some_String'
[
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String'
]
这是期望的输出
[
[
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String'
],
[
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String'
],
[
'@imp_Some_String',
'Some_String',
'Some_String'
]
]
如果物品以“@imp”开头,则可以拆分列表
我试过了,但我的解决方案会在这里产生x,y问题
谢谢。使用简单的迭代 例: 输出: 使用itertools.groupby 例:
使用简单的迭代 例: 输出: 使用itertools.groupby 例:
itertools.groupby的一个可能解决方案: 印刷品:
[['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String',
'Some_String',
'Some_String']]
itertools.groupby的一个可能解决方案: 印刷品:
[['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String',
'Some_String',
'Some_String']]
您当前的列表:
list_ = [
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String'
]
创建索引列表:
indexes = [ind for ind, el in enumerate(list_) if el.startswith('@imp')]
获取结果:
res = [list_[i: j] for i, j in zip([0] + indexes, indexes + [None]) if i != j]
print(res) # [['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String']]
您当前的列表:
list_ = [
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'@imp_Some_String',
'Some_String',
'Some_String'
]
创建索引列表:
indexes = [ind for ind, el in enumerate(list_) if el.startswith('@imp')]
获取结果:
res = [list_[i: j] for i, j in zip([0] + indexes, indexes + [None]) if i != j]
print(res) # [['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String']]
输出
[['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'],
['@imp_Some_String', 'Some_String', 'Some_String']]
输出
[['@imp_Some_String',
'Some_String',
'Some_String',
'Some_String',
'Some_String'],
['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'],
['@imp_Some_String', 'Some_String', 'Some_String']]
将所有列表元素合并到一行中,根据分隔符@imp将其拆分,将分隔符添加回由于拆分而产生的每行的开头,最后根据空格拆分每行
>>> list(map(str.split, ('@imp'+s for s in ' '.join(lst).split('@imp') if s)))
[['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String']]
将所有列表元素合并到一行中,根据分隔符@imp将其拆分,将分隔符添加回由于拆分而产生的每行的开头,最后根据空格拆分每行
>>> list(map(str.split, ('@imp'+s for s in ' '.join(lst).split('@imp') if s)))
[['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String', 'Some_String'], ['@imp_Some_String', 'Some_String', 'Some_String']]
如果列表中的第一项不是以@开头,则会引发异常。此外,OP指定的所需前缀是@imp,而不是@@TomKarzes。如果是这种情况,我认为您不能正确地对元素进行分组。在这种情况下,我们不清楚需要什么,因为OP没有完全指定问题。@TomKarzes:我已经给出了输入和输出。它是完全一样的。唯一的区别是一些字符串,它是丑陋的RTF文本,在这里并不重要。如果你需要更多的细节,我可以提供。谢谢。@Rahul我们讨论的问题是,如果第一个列表元素不是以@imp开头,您希望它做什么。它至少可以做4件事:1将第一部分包含在它自己的子列表中,即,将其视为以@imp开头,2放弃它,3报告错误,或4使用列表索引越界错误进行放大。此处显示的解决方案实现了备选方案4。如果列表中的第一项不是以@开头,则会引发异常。此外,OP指定的所需前缀是@imp,而不是@@TomKarzes。如果是这种情况,我认为您不能正确地对元素进行分组。在这种情况下,我们不清楚需要什么,因为OP没有完全指定问题。@TomKarzes:我已经给出了输入和输出。它是完全一样的。唯一的区别是一些字符串,它是丑陋的RTF文本,在这里并不重要。如果你需要更多的细节,我可以提供。谢谢。@Rahul我们讨论的问题是,如果第一个列表元素不是以@imp开头,您希望它做什么。它至少可以做4件事:1将第一部分包含在它自己的子列表中,即,将其视为以@imp开头,2放弃它,3报告错误,或4使用列表索引越界错误进行放大。这里显示的解决方案实现了备选方案4.Nice。正如我在问题中提到的,我最初的解决方案是基于这一点的。你为我的想法提供了一个有效的解决方案。谢谢,很好。正如我在问题中提到的,我最初的解决方案是基于这一点的。你为我的想法提供了一个有效的解决方案。谢谢