我有一个列表试图将值的变化分组:
input_list = ["I", "Non-I", "Non-I", "Non-I", "I", "Non-I", "Non-I", "Non-I"]
我需要的是一个输出列表,该列表将以“ I”开头的每个组分开:
output_list = [["I", "Non-I", "Non-I", "Non-I"], ["I", "Non-I", "Non-I", "Non-I"]]
我尝试了以下方法:
#!/usr/bin/env python3
from itertools import groupby
input_list = ["I", "Non-I", "Non-I", "Non-I", "I", "Non-I", "Non-I", "Non-I"]
output_list = [["I", "Non-I", "Non-I", "Non-I"], ["I", "Non-I", "Non-I", "Non-I"]]
for key, val in groupby(input_list, lambda x: x == "I"):
print(list(val))
…它几乎返回我想要的:
['I']
['Non-I', 'Non-I', 'Non-I']
['I']
['Non-I', 'Non-I', 'Non-I']
现在,我可以继续进行合并,即合并所有其他元素,但这似乎很简单。我还提出了“经典”的迭代方式:
ret = []
curr_list = []
for element in input_list:
if element != "I":
curr_list.append(element)
if element == "I":
if curr_list:
ret.append(curr_list)
curr_list = [element]
ret.append(curr_list)
有没有实现我所需的更多Python方式?
您可以groupby
生成生成器表达式的输出,并通过将其与自身压缩在一起来配对输出:
from itertools import groupby
groups = (list(g) for _, g in groupby(input_list, 'I'.__eq__))
print([[i for l in pair for i in l] for pair in zip(groups, groups)])
输出:
[['I', 'Non-I', 'Non-I', 'Non-I'], ['I', 'Non-I', 'Non-I', 'Non-I']]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句