我需要在不同数字列表中交换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)
但是,它似乎适用于某些不同数字的列表,但不适用于其他列表(包括给定的示例)。我不知道为什么。任何人都可以看到这个错误吗?
答案 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]