python 如何改变列表中的数字使其单调递减?

ecfdbz9o  于 2023-01-19  发布在  Python
关注(0)|答案(6)|浏览(182)

我列了一张单子:

first = [100, 110, 60]

如何做到:如果下一个数大于前一个数,则需要像前一个数一样减少此数,例如,答案应为:

ans = [100, 100, 60]

第二个例子:

arr = [60,50,60]
ans = [60, 50, 50]

第三个例子:

arr = [20, 100, 150]
ans = [20, 20, 20]

我试过,但我觉得这不是个好主意

for i in range(len(arr)-1):

    if arr[i] < arr[i+1]:
        answer.append(a[i+1] - 10)
    if arr[i] < arr[i+1]:
        answer.append(a[i])
    if arr[i] < arr [i+1]:
        answer.append(arr[-1])
g6ll5ycj

g6ll5ycj1#

这是scan/prefix sum operation的一个特例,在Python中是itertools.accumulate

ans = list(itertools.accumulate(arr, min))

基本上,这将输出一个列表,该列表在每个位置包含输入列表中到该位置为止的最小元素。

toe95027

toe950272#

这将在 * 原地 * 修改列表:

def fix_list(_list):
    for i, v in enumerate(_list[1:], 1):
        _list[i] = min(v, _list[i-1])
    return _list

print(fix_list([100, 110, 60]))
print(fix_list([60, 50, 60]))
print(fix_list([20, 100, 150]))
    • 输出:**
[100, 100, 60]
[60, 50, 50]
[20, 20, 20]
py49o6xq

py49o6xq3#

不是一句俏皮话,而是

last = max(arr)
ans = []
for item in arr:
   last = min(last, item)
   ans.append(last)
luaexgnf

luaexgnf4#

我认为它应该按照以下方式工作:

list = [20, 100, 100]

out = list[0]

for x in range(len(list)-1):
   if list[x+1] > list[x]:
      out.append(list[x])
   else:
      out.append(list[x+1])

print(out)
i2byvkas

i2byvkas5#

arr1 = [50, 70, 10, 120, 150]
arr2 = []
for i, x in enumerate(arr1):
    if x <= arr1[i-1] or i==0:
        arr2.append(x)
    else:
        if x <= arr2[i-1]:
            arr2.append(arr1[i-1])
        else:
            arr2.append(arr2[i-1])
print(arr2)

希望这个有用。

u5rb5r59

u5rb5r596#

下面是另一个使用列表理解的替代方法,供感兴趣的读者参考。

ans = [min(arr[:i]) if i > 0 and a > min(arr[:i]) else a for i, a in enumerate(arr)]

下面是一个例子:

代码:

arr = [100, 110, 105, 90, 110]
ans = [min(arr[:i]) if i > 0 and a > min(arr[:i]) else a for i, a in enumerate(arr)]
print(ans)

输出:

[100, 100, 100, 90, 90]

相关问题