交换列表中的最大值和最小值

swap max and min in list

我需要交换不同数字列表中的最大值和最小值。像这样:

示例输入

3 4 5 2 1

示例输出

3 4 1 2 5

我认为使用这个最有意义:

a = [3, 4, 5, 2, 1]
a[a.index(max(a))], a[a.index(min(a))] = min(a), max(a)

但是,它似乎适用于一些不同数字的列表,但不适用于其他列表(包括给定的示例)。我不知道为什么。谁能看到错误?

您可能想使用此函数来帮助您排列最小值和最大值。在 distinct-list 的情况下,它会起作用。如果您有重复项,它也会处理它们。

def swap_min_max(l):
    max_value = max(l)
    min_value = min(l)

    # get all potential indices
    idx_min = [i for i,e in enumerate(l) if e==min_value]
    idx_max = [i for i,e in enumerate(l) if e==max_value]

    # replace values
    for idx in idx_min:
        l[idx] = max_value
    for idx in idx_max:
        l[idx] = min_value

    return l

>>>> swap_min_max([4, 5, 5, 2, 1, 1])
[4, 1, 1, 2, 5, 5]

>>>> swap_min_max([3, 4, 5, 2, 1])
[3, 4, 1, 2, 5]

在多次赋值中,Python计算所有右侧部分,从左到右,然后将它们从左到右一一分配给左侧部分(参见the language reference详情)。所以:

a = [3, 4, 5, 2, 1]
a[a.index(max(a))], a[a.index(min(a))] = min(a), max(a)

a = [3, 4, 5, 2, 1]
a[a.index(max(a))], a[a.index(min(a))] = 1, max(a)

a = [3, 4, 5, 2, 1]
a[a.index(max(a))], a[a.index(min(a))] = 1, 5

a = [3, 4, 5, 2, 1]
a[a.index(5)], a[a.index(min(a))] = 1, 5

a = [3, 4, 5, 2, 1]
a[2], a[a.index(min(a))] = 1, 5

a = [3, 4, 1, 2, 1]
a[a.index(min(a))] = 5

a = [3, 4, 1, 2, 1]
a[a.index(1)] = 5

a = [3, 4, 1, 2, 1]
a[2] = 5
# ^ uh oh

a = [3, 4, 5, 2, 1]

如果最小值 最大值之前,这很好,因为我们总是替换第一次出现的最小值,结果证明是原始值。

要修复它,只需在 进行交换之前 单独计算索引。

如果数字不同,您可以使用此解决方案。

def swap(a) :
  max_index=a.index(max(a))
  min_index=a.index(min(a))
  ma=max(a)
  mi=min(a)
  a[max_index]=mi
  a[min_index]=ma
a=[3,4,5,2,1]
swap(a)
print(a)

你只需要最大和最小的索引号,你可以通过索引方法找到:

data=[3,4, 5, 2, 1]

max_va=data.index(max(data))
min_va=data.index(min(data))

data[max_va],data[min_va]=data[min_va],data[max_va]

print(data)

输出:

[3, 4, 1, 2, 5]