我需要编写一个函数,将每个数字替换为列表中下一个最高的数字。
假设我们有一个列表[5, 7, 3, 2, 8]
。5
被7
取代,列表变成了[7, 5, 3, 2, 8]
。
之后,我们交换5
和8
,所以它变成了[7, 8, 3, 2, 5]
。最后,整个列表的最大值被-1
代替。
到最后,这个例子应该输出[7, 8, 5, 3, -1]
。我写了这样的代码:
def replace_next_largest(lst):
maxes = []
for i in range(len(lst)):
check = lst[i]
next_mx = [i for i in lst if i > check and not i in maxes]
if next_mx:
maxes.append(next_mx[0])
else:
if maxes.insert(lst.index(max(lst)),-1 )
return maxes
,但它不能与输入[4, 1, 6, -7, -8, 2]
一起工作,但它适用于上面提到的其他列表和所有其他测试。我的输出是[6, 4, -1, -1, 1, -7]
,应该是[6, 2, -1, 1, -7, 4]
[6, 4, -1, -1, 1, -7]
<[6, 2, -1, 1, -7, 4]
<——正确答案
它适用于[5, 7, 3, 2, 8]
,[2, 3, 4, 5]
和[1, 0, -1, 8, -72]
根据您想要的结果,您可以对列表进行排序,然后进行查找,查找与下一个最大的数字对。这样你就可以替换列表中的项目了。通过将值压缩成对,最大的值将不包含条目。当你试图查找它时,你可以用-1
替换它。
def swap_large(l):
s = sorted(l)
d = {k:v for k, v in zip(s, s[1:])}
return [d.get(n, -1) for n in l]
swap_large([5, 7, 3, 2, 8])
# [7, 8, 5, 3, -1]
swap_large([4, 1, 6, -7, -8, 2])
# [6, 2, -1, 1, -7, 4]