wha*_*000 4 python string list nested-lists python-3.x
我有以下列表:
['1(Reg)', '100', '103', '102', '100', '2(Reg)', '98', '101', '100', '3(Reg)', '96', '99', '98', '4(Reg)', '100', '100', '100', '100', '5(Reg)', '98', '99', '99', '100', '6(Reg)', '99.47', '99.86', '99.67', '100']
Run Code Online (Sandbox Code Playgroud)
我想将此列表拆分为多个列表,以便每个子列表都有子串"(Reg)"出现一次:
[['1(Reg)', '100', '103', '102', '100'],
['2(Reg)', '98', '101', '100'],
['3(Reg)', '96', '99', '98'],
['4(Reg)', '100', '100', '100', '100'],
['5(Reg)', '98', '99', '99', '100'],
['6(Reg)', '99.47', '99.86', '99.67', '100']]
Run Code Online (Sandbox Code Playgroud)
我已尝试使用分隔符加入列表并将其拆分为(Reg),但这不起作用.如何将列表拆分为上面的嵌套列表?
WVO答案略有不同(优化)版本:
splitted = []
for item in l:
if '(Reg)' in item:
splitted.append([])
splitted[-1].append(item)
#[['1(Reg)', '100', '103', '102', '100'], ['2(Reg)', '98', '101', '100'],
# ['3(Reg)', '96', '99', '98'], ['4(Reg)', '100', '100', '100', '100'],
# ['5(Reg)', '98', '99', '99', '100'],
# ['6(Reg)', '99.47', '99.86', '99.67', '100']]
Run Code Online (Sandbox Code Playgroud)
您可以使用itertools.groupby正则表达式:
import itertools
import re
s = ['1(Reg)', '100', '103', '102', '100', '2(Reg)', '98', '101', '100', '3(Reg)', '96', '99', '98', '4(Reg)', '100', '100', '100', '100', '5(Reg)', '98', '99', '99', '100', '6(Reg)', '99.47', '99.86', '99.67', '100']
new_data = [list(b) for _, b in itertools.groupby(s, key=lambda x:bool(re.findall('\d+\(', x)))]
final_data = [new_data[i]+new_data[i+1] for i in range(0, len(new_data), 2)]
Run Code Online (Sandbox Code Playgroud)
输出:
[['1(Reg)', '100', '103', '102', '100'],
['2(Reg)', '98', '101', '100'],
['3(Reg)', '96', '99', '98'],
['4(Reg)', '100', '100', '100', '100'],
['5(Reg)', '98', '99', '99', '100'],
['6(Reg)', '99.47', '99.86', '99.67', '100']]
Run Code Online (Sandbox Code Playgroud)
这是一种方式,但不一定是最佳方式:
from itertools import zip_longest
lst = ['1(Reg)', '100', '103', '102', '100', '2(Reg)', '98', '101', '100',
'3(Reg)', '96', '99', '98', '4(Reg)', '100', '100', '100', '100',
'5(Reg)', '98', '99', '99', '100', '6(Reg)', '99.47', '99.86', '99.67', '100']
indices = [i for i, j in enumerate(lst) if '(Reg)' in j]
lst_new = [lst[i:j] for i, j in zip_longest(indices, indices[1:])]
# [['1(Reg)', '100', '103', '102', '100'],
# ['2(Reg)', '98', '101', '100'],
# ['3(Reg)', '96', '99', '98'],
# ['4(Reg)', '100', '100', '100', '100'],
# ['5(Reg)', '98', '99', '99', '100'],
# ['6(Reg)', '99.47', '99.86', '99.67', '100']]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |