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

Lev*_*ley 2 python swap list python-3.x

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

示例输入

3 4 5 2 1
Run Code Online (Sandbox Code Playgroud)

示例输出

3 4 1 2 5
Run Code Online (Sandbox Code Playgroud)

我认为使用这将是最有意义的:

a = [3, 4, 5, 2, 1]
a[a.index(max(a))], a[a.index(min(a))] = min(a), max(a)
Run Code Online (Sandbox Code Playgroud)

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

jon*_*rpe 9

在多个赋值中,Python从左到右计算所有右侧部分,然后从左到右逐个分配到左侧部分(有关详细信息,请参阅语言参考).所以:

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]
Run Code Online (Sandbox Code Playgroud)

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

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