Проблема в замене и назначении минимальных и максимальных элементов - PullRequest
0 голосов
/ 22 апреля 2019

ВАЖНО 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 часов в попытках найти объяснение этому ... Пожалуйста, помогите

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Причина, по которой это не работает, заключается в том, что назначения выполняются последовательно. Когда вы пишете:

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.

В вашем коде предполагается, что назначаемые индексы вычисляются до выполнения любого из назначений, но на самом деле это не так.

0 голосов
/ 23 апреля 2019

Ваш код не работает, если минимум находится перед максимумом.

Например:

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'

Я жду некоторыхИллюминаты должны иметь ответ на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...