我需要找到所有长度大于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
Input: [True, False, True]
Output: [[True, False, True]]
Input: [True, True, False, True, True, False, True, False, False]
Output: [[True, False, True], [True, False, True, False]]
Input: [True, False, True]
Output: [[True, False, True]]
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]]
谢谢!
答案 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
位置。请注意底角的情况。