python 我在尝试改变序列改变方向的次数

fdbelqdn  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(100)

我正在尝试创建一个程序,当整数列表从正到负再到中性等变化时,该程序会添加到一个特定的变量中,但是我一直得到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]))
wpx232ag

wpx232ag1#

你需要跟踪最后一个方向--如果所有方向没有不同,你可以很容易地忽略它们--不需要跟踪x,你还需要跟踪变化的数量。
这可以这样做:

def changing_direction(elems: list[int]) -> int:
    # can not compare with 0 or 1 elem => 0 changes
    if len(elems) < 2: 
        return 0

    changes = 0
    # helper, returns UP or DOWN or umplicit None based on b-a 
    def ud(a,b):
        if b-a > 0: return "UP"
        if b-a < 0: return "DOWN"
        
    # current start direction
    direction = None
    for idx, e in enumerate(elems):
        try:
            # save old direction, initially None
            ld = direction
            # get new direction, maybe None
            direction = ud(e,elems[idx+1])
            print(direction) # --> comment for less output
            
            # if both are not None and different we have a change in direction
            # if either is None: same values this and last time round
            # 
            if direction is not None and ld is not None and ld != direction:
                changes += 1
            if direction is None and ld is not None:
                direction = ld # restore last direction for next time round
        except IndexError:
            pass # end of list reached
                
    return changes

    print("Example:")
    print(changing_direction([6, 6, 6, 4, 1, 2, 5, 9, 7, 8, 5, 9, 4, 2, 6]))

以获得:

Example:
None
None
DOWN
DOWN
UP
UP
UP
DOWN
UP
DOWN
UP
DOWN
DOWN
UP
7

使用合适的变量名很容易理解。如果你把“UP”,“DOWN”存储在一个列表中,你也可以通过简单的迭代来计算你的变化。
要获得更简洁的计算方法,请研究列表解析。

zfycwa2u

zfycwa2u2#

通过使用zip()和列表解析,可以大大简化函数,这使得它返回第一次更改不计算在内的正确值。

def changing_direction(elements: list[int]) -> int:
    diffs = (i-j for i,j in zip(elements[:-1], elements[1:]) if i-j!=0)
    return sum(i*j < 0 for i,j in zip(diffs[:-1], diffs[1:]))

zip(somelist[:-1], somelist[1:])基本上返回包含连续元素的元组作为生成元。
我们删除所有的0元素,因为它们会在下面的逻辑中引起问题。
这里的主要逻辑是,如果方向改变,则2个连续差值相乘在一起时将为负
sum在这里用于计数,因为True计为1,False计为0
最后,如果你知道列表没有两个连续的项作为相同的值,你可以把它作为一个1行的lambda。

changing_direction = lambda seq: sum((i-j)*(j-k)<0 for i,j,k in zip(seq, seq[1:], seq[2:]))

使得

changing_direction([6, 6, 6, 4, 1, 2, 5, 9, 7, 8, 5, 9, 4, 2, 6])

结果为7

相关问题