交换和分配最小和最大元素时出现问题

2024-04-25 05:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

重要的升级结束! 现有的代码并不适用于所有情况。你知道吗

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]

现在它适用于所有情况。但关于以前案件的问题仍然悬而未决 请帮忙。我花了大约两个小时的时间试图找到一些解释。。。 请帮忙


Tags: 代码in程序forindexdef情况myfunc
2条回答

它不起作用的原因是分配是按顺序执行的。当你写:

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赋回到它。你知道吗

您的代码假设要分配的索引是在任何分配完成之前计算的,但实际情况并非如此。你知道吗

如果最小值位于最大值之前,则代码不起作用。你知道吗

例如:

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'

我在等光明会的人来回答这个问题。你知道吗

相关问题 更多 >