【发布时间】:2019-04-18 15:07:26
【问题描述】:
我有一个列表,我试图按值的变化进行分组:
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']
现在我可以继续合并它,即合并所有其他元素,但这似乎是一个 hack。我还提出了“经典”的迭代方式:
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)
有没有更 Pythonic 的方式来实现我的需要?
【问题讨论】:
-
“我”总是第一个列表项吗?如果没有,你能举一个期望的输入和输出的例子吗?
-
@Chris_Rands 是的,是的。良好的观察力。