Найти - Пользователи
Полная версия: Почему не работает перестановка min и max?
Начало » Python для новичков » Почему не работает перестановка min и max?
1 2
rjk
Доброго дня!
Помогите постичь, почему программа:
 a = [int(i) for i in input().split()]
a[a.index(min(a))], a[a.index(max(a))] = a[a.index(max(a))], a[a.index(min(a))]
print(' '.join([str(i) for i in a]))
меняет местами min и max в наборе данных “3 4 5 2 1”, но не меняет в наборе “1 5 4 3 2”?
Заранее благодарю.
Papa_Svin
Вероятно потому, что функция index в правой и левой частях конструкции во второй строке возвращает разные значения для min и max. Эти значения надо запомнить.
 a = [int(i) for i in input().split()]
_min = min(a)
_max = max(a)
index_min = a.index(_min)
index_max = a.index(_max)
print(index_min, index_max)
a[index_min], a[index_max] = a[index_max], a[index_min]
print(' '.join([str(i) for i in a]))
rami
Papa_Svin
Вероятно потому, что функция index в правой и левой частях конструкции во второй строке возвращает разные значения для min и max.
Значения запоминать надо, бесспорно, но мне кажется есть какая-то странность, которая зависит от порядка расположения максимума и минимума в исходном списке:
 a=list(map(int, '54321'))  #'12345' не меняет местами, а '54321' меняет
print(a)
a[a.index(min(a))], a[a.index(max(a))] = max(a),min(a)
print(a)
Papa_Svin
rami
Значения запоминать надо, бесспорно, но мне кажется есть какая-то странность, которая зависит от порядка расположения максимума и минимума в исходном списке:
Да нет тут никакой странности. После того, как произошло первое присваивание
 a[a.index(min_a)] = max_a
что должна вернуть функция index для
 a.index(max_a)
???
Она вернет значение индекса, по которому УЖЕ лежит max_a (мы его только что туда засунули), а мы туда снова записываем min_a. Индекс по которому находится максимум мы вообще получается не трогаем.
rami
Да, странность случилась со мной, забыл что Питон ленивый, хватает первое подходящее значение: сначала меняет минимум на максимум, а затем берёт первый встречный максимум и меняет его на минимум. Если в исходном списке минимум был раньше максимума, то результат “останется прежним” — минимум заменится на максимум и обратно на минимум. Если максимум был раньше минимума, то результат получается “как надо”.

Хороший пример как не надо работать со списками.
Papa_Svin
rami
Да, странность случилась со мной, забыл что Питон ленивый, хватает первое подходящее значение: сначала меняет минимум на максимум, а затем берёт первый встречный максимум и меняет его на минимум. Если в исходном списке минимум был раньше максимума, то результат “останется прежним” — минимум заменится на максимум и обратно на минимум. Если максимум был раньше минимума, то результат получается “как надо”.

Хороший пример как не надо работать со списками.


Ну блин!!! Ленивость тут совсем не при чем. Абсолютно.
Распаковка и упаковка кортежа (а именно она и происходит когда вы пишите a, b = b, a здесь (b, a) это просто кортеж) происходит последовательно.
   
c = b, a  #1
a = c[0]  #2
b = c[1]  #3
вот как то так.
А у вас в индексах при с функция, которая зависит от состояния некоторого списка. В строке #2 вы меняете список, и соответственно в строке 3 функция index дает не ожидаемый результат. При чем тут ленивость?
rjk
Всем дня!
Добавил переменные для хранения min и max
 mn = 0
mx = 0
a = [int(i) for i in input().split()]
mn, mx = a[a.index(min(a))], a[a.index(max(a))]
#print(a[a.index(min(a))], a[a.index(max(a))])
#print(mn, mx)
a[a.index(min(a))], a[a.index(max(a))] = mx, mn
print(' '.join([str(i) for i in a]))
также меняет в первом наборе, не меняет во втором.
Значения в переменные присваиваются верные. Вот теперь совсем не понятно, что не так.
rami
Papa_Svin в ответе #2 дал правильное решение.
rjk
Я не против, но хотелось бы разобраться, почему не работает мой вариант. С первой редакцией более-менее понятно, хотя в туториале емнип было сказано что так можно (a, b = b, a). Видимо, это прокатывает только с переменными, не с более сложными конструкциями.
Попробовал так
 mn = 0
mx = 0
a = [int(i) for i in input().split()]
#mn, mx = a[a.index(min(a))], a[a.index(max(a))]
mn, mx = min(a), max(a)
#print(a[a.index(min(a))], a[a.index(max(a))])
#print(mn, mx)
a[a.index(min(a))], a[a.index(max(a))] = mx, mn
#print(a[a.index(min(a))], a[a.index(max(a))])
print(' '.join([str(i) for i in a]))
результат тот же.
ZerG
Самое простое в вашем случае запустить отладку - и выполняя пошагово код - смотреть чему какая переменная у вас равна.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB