当第一个元素比下一个Python好时减去列表中的连续元素

2024-10-04 11:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个程序来完成以下任务:

当输入一个列表a时,如果结果是非负数,它将减去连续的元素(从开头开始)。 例如,如果

a=[3,2,1]

然后将减去连续数,因此a=[1,1],然后a=[0]。另外,在结果中,所有数字都必须升序(例如,列表中不能有2,1)。另一个例子:

^{pr2}$

以下是我当前的代码(其中a是随机生成的):

import random
a=[random.randint(1,10) for e in range(20)]
print(a)
loop=1
while True:
    try:
        #print(loop,a)
        subloop=0
        while subloop<loop:
            if a[loop-subloop]<=a[loop-1-subloop]:
                a[loop-1-subloop]=a[loop-1-subloop]-a.pop(loop-subloop)
                if loop!=1:
                    loop-=1
            subloop+=1
        if a[loop]<=a[loop-1]:
            a[loop-1]=a[loop-1]-a.pop(loop)
        else:
            loop+=1
    except IndexError:
        break
print(a)

这段代码感觉有点长/不合适。有没有更好或更短/更有效的方法?在


Tags: 代码程序loop元素列表if数字random
2条回答

另一种解决方案:

def my_func(a):
    next_i = next((i for i in range(len(a)-1) if (a[i] - a[i+1]) >=0), None)
    while next_i is not None:
        a = a[:next_i] + [a[next_i] - a[next_i+1]] + a[next_i+2:]
        next_i = next((i for i in range(len(a)-1) if (a[i] - a[i+1]) >=0), None)
    return a

print(my_func(a=[1, 10, 7, 3, 2]))
#[1, 2]

print(my_func(a=[3, 2, 1]))
#[0]

但是,这比@bphi的解决方案稍慢:

^{pr2}$

以下是我的看法:

a = [1, 10, 7, 3, 2]
b = [3, 2, 1]


def index_helper(l):
    for i, x in enumerate(l[:-1]):
        if l[i] >= l[i+1]:
            return i


def reduce(l):
    i = index_helper(l)
    while i is not None:
        l[i:i + 2] = [l[i] - l[i + 1]]
        i = index_helper(l)
    return l


>>> reduce(a)
[1, 2]

>>> reduce(b)
[0]

相关问题 更多 >