Skip to main content
 首页 » 编程设计

python之当子列表的大小依赖于数据值(种子和扩展)时,将列表拆分为子列表

2025年05月04日11luoye11

我有一个列表,其中 header 以 "Header" 字符串开头,相应的 与标题关联的数据在列表中连续跟随它,以下一个 "Header" 前缀元素结束:

data = ["Header: 1", 
        "Some info 1", 
        "Some info 2", 
        "Some info 3", 
        "Header: 2", 
        "Some info 4", 
        "Header: 3", 
        "Some info 5", 
        "Some info 6", 
        ] 
len(data) # returns 9 

我想按标题间隔拆分列表,以创建标题数据元素列表 - 这是经典的种子和扩展。所以最终目标是:

entries = [ ["Header: 1", 
        "Some info 1", 
        "Some info 2", 
        "Some info 3"], 
        ["Header: 2", 
        "Some info 4"], 
        ["Header: 3", 
        "Some info 5", 
        "Some info 6"] 
        ] 
 len(data) # returns 3 

与每个标题关联的数据元素的数量是可变的。 因为每个 header 都以 "Header" 开头,所以我可以用它来确定 间隔。 我可以使用循环来解决:

entries = [] 
for i in range(0,len(data)): 
    if "Header" in data[i]: 
        entry = [] 
        entry.append(data[i]) 
        i = i + 1 
        while("Header" not in data[i]): 
            entry.append(data[i]) 
            i = i + 1 
            if i == len(data): 
                break 
        entries.append(entry) 

但是,我想知道是否有一种单线(或类似的东西)可以做到这一点? 也许是列表理解方法。我不熟悉 python 库,但是来自标准库的解决方案也可以。

请您参考如下方法:

您可以使用 itertools.groupby,并按“不以 Header 开头”进行分组。对元素强制列表迭代:

l = [list(x) for a,x in itertools.groupby(data,lambda x : not x.startswith("Header"))] 

现在 l 是 [['Header: 1'], ['Some info 1', 'Some info 2', 'Some info 3'], ['Header: 2 '], ['Some info 4'], ['Header: 3'], ['Some info 5', 'Some info 6']]

然后将项目 2 2 分组:

result = [l[i]+l[i+1] for i in range(0,len(l),2)] 

结果:

[['Header: 1', 'Some info 1', 'Some info 2', 'Some info 3'], ['Header: 2', 'Some info 4'], ['Header: 3', 'Some info 5', 'Some info 6']] 

注意:如果有空信息 block 则不起作用