Как я могу найти все полосы неравных элементов bool в списке?

#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. Спасибо, похоже, это работает, не совсем понимаю, как это работает, но постараюсь присмотреться. Все еще интересно, есть ли какая-то библиотека или встроенная для такого рода задач.