重要的UPD最终! 现有代码不适用于所有情况。
def myfunc(x):
a = [int(i) for i in x.split()]
a[a.index(min(a))], a[a.index(max(a))] = a[a.index(max(a))], a[a.index(min(a))]
a = [str(i) for i in a]
return ' '.join(a)
myfunc()
它适用于3 4 5 2 1而不适用于1 5 4 3 2。 为什么?
!!! UPD:我做了一些更改,它看起来很奇怪。 我分别使用了两行(注释其中之一)。在某些情况下,该程序会得出不同的结果。但是最有趣的是,当我使用其中两个时,没有注释-程序不返回收入字符串吗?
# a[a.index(min(a))], a[a.index(max(a))] = a[a.index(max(a))], a[a.index(min(a))]
a[a.index(max(a))], a[a.index(min(a))] = a[a.index(min(a))], a[a.index(max(a))]
我使用的情况:
#print(myfunc("5 1 4 3 2"))
#print(myfunc("1 5 4 3 2"))
#print(myfunc("3 4 5 2 1"))
#print(myfunc("-30000 30000"))
#print(myfunc("2147483647 -2147483648"))
#print(myfunc("1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 17 16 15 14"))
#print(myfunc("1 2 3 4 5 6 7 8 9 10"))
#print(myfunc("1 9 8 7 6 5 4 3 2 10"))
UPD + = 1我将代码更改为:
minind = a.index(min(a))
maxind = a.index(max(a))
a[minind], a[maxind] = a[maxind], a[minind]
现在,它适用于所有情况。但是关于以前案件的问题仍然悬而未决 请帮忙。我花了大约2个小时试图找到对此的一些解释... 请帮助
答案 0 :(得分:3)
之所以不起作用,是因为分配是按顺序执行的。当您写时:
a[a.index(min(a))], a[a.index(max(a))] = a[a.index(max(a))], a[a.index(min(a))]
它基本上等同于:
tempmax, tempmin = a[a.index(max(a))], a[a.index(min(a))]
a[a.index(min(a))] = tempmax
a[a.index(max(a))] = tempmin
但是请注意,在完成tempmax
分配后,a.index(max(a))
可以更改。 index()
返回最早的索引,因此,如果最小元素在最大元素之前,则现在将返回原始最小元素的位置(因为它现在包含最大元素),并为其分配tempmin
您的代码假定要分配的索引是在完成任何分配之前计算的,但这实际上并不是这样的。
答案 1 :(得分:0)
如果最小值位于最大值之前,则您的代码不起作用。
例如:
s = "1 5 4 3 2" # this doesn't work
myfunc(s)
>>> '1 5 4 3 2'
s = "5 1 4 3 2" # this works
myfunc(s)
>>> '1 5 4 3 2'
但是,正如您所注意到的,如果在交换之前定义索引,则一切正常。
def myfunc(x):
a = [int(i) for i in x.split()]
mn = a.index(min(a))
mx = a.index(max(a))
a[mn], a[mx] = a[mx], a[mn]
a = [str(i) for i in a]
return ' '.join(a)
s = "1 5 4 3 2"
myfunc(s)
>>> '5 1 4 3 2'
我正在等待有启迪精神的人对此给出答案。