我正在尝试创建一个程序,当整数列表从正到负再到中性等变化时,该程序会添加到一个特定的变量中,但是我一直得到8而不是7的输出,但是找不到bug。请看下面的代码
def changing_direction(elements: list[int]) -> int:
#to check whether true or false with ones and zeros
x = 0
#to store last number to check with new number
a = 0
#to subtract last number from new number
b = 0
d = 0
e = 0
for i in elements:
b = a - i
if b > 0:
x = 1
elif b < 0:
x = 0
elif b != 0:
a = i
e = x
break
if x != e:
d += 1
a = i
e = x
return d
print("Example:")
print(changing_direction([6, 6, 6, 4, 1, 2, 5, 9, 7, 8, 5, 9, 4, 2, 6]))
2条答案
按热度按时间wpx232ag1#
你需要跟踪最后一个方向--如果所有方向没有不同,你可以很容易地忽略它们--不需要跟踪
x
,你还需要跟踪变化的数量。这可以这样做:
以获得:
使用合适的变量名很容易理解。如果你把“UP”,“DOWN”存储在一个列表中,你也可以通过简单的迭代来计算你的变化。
要获得更简洁的计算方法,请研究列表解析。
zfycwa2u2#
通过使用
zip()
和列表解析,可以大大简化函数,这使得它返回第一次更改不计算在内的正确值。zip(somelist[:-1], somelist[1:])
基本上返回包含连续元素的元组作为生成元。我们删除所有的0元素,因为它们会在下面的逻辑中引起问题。
这里的主要逻辑是,如果方向改变,则2个连续差值相乘在一起时将为负
sum
在这里用于计数,因为True计为1,False计为0最后,如果你知道列表没有两个连续的项作为相同的值,你可以把它作为一个1行的lambda。
使得
结果为7