目标是根据以下规则根据每个元素的邻居拆分整数列表:
(当前/焦点值小于或等于上一个)和(当前值等于下一个),即 prev_value >= focal_value == next_value
(当前值小于上一个)和(当前值小于下一个),即 prev_value > focal_value < next_value
为了说明,给定x产品y:
x = (1, 4, 2, 1, 4, 2, 4, 1, 4, 1, 4, 4, 3)
y = [[1, 4, 2], [1, 4], [2, 4], [1, 4], [1, 4, 4, 3]]
assert func(x) == y
我试过了:
def per_window(sequence, n=1):
"""
From http://stackoverflow.com/q/42220614/610569
>>> list(per_window([1,2,3,4], n=2))
[(1, 2), (2, 3), (3, 4)]
>>> list(per_window([1,2,3,4], n=3))
[(1, 2, 3), (2, 3, 4)]
"""
start, stop = 0, n
seq = list(sequence)
while stop <= len(seq):
yield tuple(seq[start:stop])
start += 1
stop += 1
def func(x):
result = []
sub_result = [x[0]]
for prev_value, focal_value, next_value in per_window(x, 3):
# These if and elif cases trigger syllable break.
if prev_value >= focal_value == next_value:
sub_result.append(focal_value)
result.append(sub_result)
sub_result = []
elif prev_value > focal_value < next_value:
result.append(sub_result)
sub_result = []
sub_result.append(focal_value)
else: # no break
sub_result.append(focal_value)
sub_result.append(next_value)
result.append(sub_result)
return result
x = (1, 4, 2, 1, 4, 2, 4, 1, 4, 1, 4, 4, 3)
y = [[1, 4, 2], [1, 4], [2, 4], [1, 4], [1, 4, 4, 3]]
assert func(x) == y
但我的问题是:
如果我们仔细查看 if 和 elif “案例”,看起来第一个 if 永远不会被捕获,因为第二个 if 将首先到达。是对的吗?if
第一个案例会出现的例子有哪些?
有没有更好的方法来实现基于规则拆分子列表的相同目标?
最后两个追加需要存在于循环之外per_window
,这些扼杀者叫什么?有没有办法不这样做循环?
白板的微信
相关分类