У меня есть список, который я пытаюсь сгруппировать по изменению значения:
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)
Есть ли более Pythonic способ достижения того, что мне нужно?