我有一个列表,其中 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 则不起作用
