用python中的特定模式将列表分解为嵌套列表

2024-04-30 03:43:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面提到的列表,其中“T0000XXX”是交易id,“IXXX”是项目列表,这些项目的数量是完全随机的,比如第一个交易有5个项目,第二个有2个项目,第三个同样有9个项目,最后一个元素是项目金额的总和

此列表包含>;10万个元素

['T0000093', 'I717', 'I491', 'I82', 'I345', 'I423', 2469.0,
 'T0000166', 'I4', 'I425', 3534.0,
 'T0000256', 'I558', 'I325', 'I242', 'I523', 'I568', 'I207', 'I137', 'I15', 'I477', 8467.0]

所以我想把这个列表分解成嵌套列表,其中子列表将有3个属性,事务id,项目数量和金额,如下所示

[['T0000093', 'I717', 'I491', 'I82', 'I345', 'I423', 2469.0],
 ['T0000166', 'I4', 'I425', 3534.0],
 ['T0000256', 'I558', 'I325', 'I242', 'I523', 'I568', 'I207', 'I137', 'I15', 'I477', 8467.0]]

Tags: 项目id元素列表数量交易金额i4
3条回答

可能有一种通过理解来实现这一点的奇特方法,但我认为最简单的选择是迭代地构建列表:

from typing import List, Union

flat_list: List[Union[str, float]] = ['T0000093', 'I717', 'I491', 'I82', 'I345', 'I423', 2469.0, 'T0000166', 'I4', 'I425', 3534.0, 'T0000256', 'I558', 'I325', 'I242', 'I523', 'I568', 'I207', 'I137', 'I15', 'I477', 8467.0]
nested_list: List[List[Union[str, float]]] = []
sub_list: List[Union[str, float]] = []
for item in flat_list:
    if isinstance(item, str) and item.startswith("T"):
        sub_list = []
        nested_list.append(sub_list)
    sub_list.append(item)

每个事务都以“T”开头。可以使用此选项将列表拆分为嵌套列表。代码如下所示:

L=['T0000093', 'I717', 'I491', 'I82', 'I345', 'I423', 2469.0, 'T0000166', 'I4', 'I425', 3534.0, 'T0000256', 'I558', 'I325', 'I242', 'I523', 'I568', 'I207', 'I137', 'I15', 'I477', 8467.0]

nested_list=[]
List=[]
for x in L:
    if(len(List)==0):
        List.append(x)
    elif(type(x)==str and x[0]=='T'):
        nested_list.append(List)
        List=[]
        List.append(x)
    else:
        List.append(x)
if(len(List)!=0):
    nested_list.append(List)
print(nested_list)
start = 0
nested = []
your_list = your_list[::-1]

for i in range(len(your_list)):
    if str(your_list[i]).startswith('T'):
        nested.append(your_list[start:i])
        start = i

# [[], ['T0000093', 'I717', 'I491', 'I82', 'I345', 'I423', 2469.0], ['T0000166', 'I4', 'I425', 3534.0], ['T0000256', 'I558', 'I325', 'I242', 'I523', 'I568', 'I207', 'I137', 'I15', 'I477', 8467.0]]

最后把空的盒子搬走

相关问题 更多 >