使用itertools根据值的变化拆分列表

slhck

我有一个列表试图将值的变化分组:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章