如何将列表中的数字改为单调递减的形式?

5

我有一个列表:

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])

你为什么要三次使用相同的条件? - matszwecja
1
如果您输入了 [100, 110, 105, 90, 110],那么输出应该是什么? - ScottC
1
我猜测 [100, 100, 100, 90, 90] - kaliiiiiiiii
6个回答

7
这是一个特殊情况的前缀和操作(prefix sum),在Python中可以使用itertools.accumulate实现:
ans = list(itertools.accumulate(arr, min))

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


3

这将原地修改列表:

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]

itertools中的*accumulate()*更快 - 感谢@Konrad - DarkKnight

1
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)

希望这能有所帮助。

1

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

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)

你的代码中有拼写错误! - God Is One

1

不是一行代码,但也许可以这样表述:

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

我认为它应该只低于或等于先前的数字,而不是最大值。 - kaliiiiiiiii
1
“max” 的作用只是确保第一个“min”按预期工作。它不是在寻找最大值,而是遍历列表。 - saquintes

0
这是另一种选择,使用列表推导式的方式,对于那些感兴趣的人来说。
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]

不错的一行代码。只是指出,如果列表要扩展,那么对 min(arr[:i]) 的不断调用将无法很好地扩展。但对于较小的列表,可能并不重要。 - saquintes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接