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。正如我在问题中提到的,我最初的解决方案是基于这一点的。你为我的想法提供了一个有效的解决方案。谢谢,很好。正如我在问题中提到的,我最初的解决方案是基于这一点的。你为我的想法提供了一个有效的解决方案。谢谢