Python: разбиение списка целых чисел на основе шага между нимиpython
Answers
def _get_parts(i, step=1):
o = []
for x in i:
if o and o[-1] and x - step == o[-1][-1]:
o[-1].append(x)
else:
o.append([x])
return o
_get_parts([0, 1, 3, 5, 6, 7], step=1)
# [[0, 1], [3], [5, 6, 7]])
Question
У меня есть следующая проблема. Имея список целых чисел, я хочу разбить его на список списков, когда шаг между двумя элементами исходного списка ввода не равен 1. Например: input = [0, 1, 3, 5, 6, 7 ], output = [[0, 1], [3], [5, 6, 7]]
Я написал следующую функцию, но это ужасно, и мне было интересно, поможет ли кто-нибудь из вас помочь мне получить более приятное решение. Я попытался использовать itertools, но не смог его решить.
Вот мое решение:
def _get_parts(list_of_indices):
lv = list_of_indices
tuples = zip(lv[:-1], lv[1:])
split_values = []
for i in tuples:
if i[1] - i[0] != 1:
split_values.append(i[1])
string = '/'.join([str(i) for i in lv])
substrings = []
for i in split_values:
part = string.split(str(i))
substrings.append(part[0])
string = string.lstrip(part[0])
substrings.append(string)
result = []
for i in substrings:
i = i.rstrip('/')
result.append([int(n) for n in i.split('/')])
return result
Большое спасибо!
Вот как я это сделаю:
inp = [0, 1, 3, 5, 6, 7]
base = []
for item in inp:
if not base or item - base[-1][-1] != 1: # If base is empty (first item) or diff isn't 1
base.append([item]) # Append a new list containing just one item
else:
base[-1].append(item) # Otherwise, add current item to the last stored list in base
print base # => [[0, 1], [3], [5, 6, 7]]