交换列表中的最大值和最小值
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]
我需要交换不同数字列表中的最大值和最小值。像这样:
示例输入
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]