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

时间:2018-04-06 07:15:24

标签: python python-3.x list swap

我需要在不同数字列表中交换max和min。像这样:

示例输入

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)

但是,它似乎适用于某些不同数字的列表,但不适用于其他列表(包括给定的示例)。我不知道为什么。任何人都可以看到这个错误吗?

4 个答案:

答案 0 :(得分:8)

在多个作业中,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]

如果最小值之前的最大值,这可以正常工作,因为我们总是替换第一次出现的最小值,结果是原始值。

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

答案 1 :(得分:1)

您可能希望使用此功能来帮助您置换最小值和最大值。在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]

答案 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)

答案 3 :(得分:0)

您需要的只是索引方法中可以找到的max和min的索引号:

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]