首页 > 解决方案 > 按项目中的子字符串拆分列表并保留分隔符

问题描述

这是输入:

[
    '@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'
    ]
]

这个想法是如果我尝试过的项目拆分列表,startswith('@imp') 但我的解决方案会在这里创建 x,y 问题。

谢谢。

标签: pythonlistsplit

解决方案


使用简单的迭代

前任:

data = [
    '@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'
]

result = []
for i in data:              #Iterate items
    if i.startswith("@"):   #Check if item startswith "@"
        result.append([i])  #Append new list with item
    else:
        result[-1].append(i)   #Append item to previous list

print(result)

输出:

[['@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

前任:

from itertools import groupby
data = [
    '@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'
]

data = [list(v) for _, v in groupby(data, lambda x: x.startswith("@"))]
result = [i + v for i, v in zip(data[0::2], data[1::2])]

推荐阅读