如何在列表中找到所有不等bool元素的条纹?

时间:2019-04-15 17:13:20

标签: python-3.x algorithm search

我需要找到所有长度大于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 个答案:

答案 0 :(得分: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位置。请注意底角的情况。