#python-3.x #algorithm #search
#python-3.x #алгоритм #Поиск
Вопрос:
Мне нужно найти все последовательности длиннее 2 неравных соседних элементов.
Я пытался написать свою собственную функцию, которая это сделает, но, к сожалению, я что-то упускаю, также код выглядит ужасно, я надеюсь, что у python уже есть что-то, что может решить мою проблему.
from itertools import groupby
def zig_zag(l):
if len(l) < 3:
return []
streaks = []
streak = []
going = False
i = 1
while i < len(l) - 1:
if l[i] != l[i - 1]:
streak.append(l[i - 1])
streak.append(l[i])
going = True
elif l[i] != l[i 1] and going:
streak.append(l[i 1])
else:
streak = []
streaks.append(streak)
going = False
i = 1
# Check for last elem
if l[-1] != l[-2] and going:
streak.append(l[-1])
if going:
streaks.append(streak)
res = []
for streak in streaks:
res.append([x[0] for x in groupby(streak)])
return res
Ожидаемый результат:
Пример 1:
Input: [True, False, True]
Output: [[True, False, True]]
Пример 2:
Input: [True, True, False, True, True, False, True, False, False]
Output: [[True, False, True], [True, False, True, False]]
Текущие результаты:
Пример 1:
Input: [True, False, True]
Output: [[True, False, True]]
Пример 2:
Input: [True, True, False, True, True, False, True, False, False]
Output: [[True, False, True, False, True, False, True, False], [True, False, True, False, True, False, True, False]]
Заранее спасибо!
Ответ №1:
Я не уверен, достаточно ли это Pythonic, но вот гораздо более простой способ сделать это
arr = [True, True, False, True, True, False, True, False, False]
res = []
start = 0
for i in range(1, len(arr)):
if arr[i] == arr[i-1]:
if i-start > 2:
res.append(arr[start:i])
start = i
if len(arr) - start > 2:
res.append(arr[start:])
print(res)
Выводит: [[True, False, True], [True, False, True, False]]
Сохраняйте start
индекс, с которого начинается ваш текущий подмассив. Как только вы найдете повторяющийся символ, выясните, имеет ли длина текущего подмассива больше 2
, и сбросьте start
позицию. Обратите внимание на угловой регистр в конце.
Комментарии:
1. Спасибо, похоже, это работает, не совсем понимаю, как это работает, но постараюсь присмотреться. Все еще интересно, есть ли какая-то библиотека или встроенная для такого рода задач.