Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2018 01:50:32

rjk
Зарегистрирован: 2018-10-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Доброго дня!
Помогите постичь, почему программа:

 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”?
Заранее благодарю.

Офлайн

#2 Окт. 28, 2018 08:34:53

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Вероятно потому, что функция 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]))

Офлайн

#3 Окт. 28, 2018 08:58:16

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

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)

Офлайн

#4 Окт. 28, 2018 10:12:16

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

rami
Значения запоминать надо, бесспорно, но мне кажется есть какая-то странность, которая зависит от порядка расположения максимума и минимума в исходном списке:
Да нет тут никакой странности. После того, как произошло первое присваивание
 a[a.index(min_a)] = max_a
что должна вернуть функция index для
 a.index(max_a)
???
Она вернет значение индекса, по которому УЖЕ лежит max_a (мы его только что туда засунули), а мы туда снова записываем min_a. Индекс по которому находится максимум мы вообще получается не трогаем.

Офлайн

#5 Окт. 28, 2018 11:37:26

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

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

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

Офлайн

#6 Окт. 28, 2018 11:47:45

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

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

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


Ну блин!!! Ленивость тут совсем не при чем. Абсолютно.
Распаковка и упаковка кортежа (а именно она и происходит когда вы пишите a, b = b, a здесь (b, a) это просто кортеж) происходит последовательно.
   
c = b, a  #1
a = c[0]  #2
b = c[1]  #3
вот как то так.
А у вас в индексах при с функция, которая зависит от состояния некоторого списка. В строке #2 вы меняете список, и соответственно в строке 3 функция index дает не ожидаемый результат. При чем тут ленивость?

Отредактировано Papa_Svin (Окт. 28, 2018 11:48:28)

Офлайн

#7 Окт. 28, 2018 12:25:12

rjk
Зарегистрирован: 2018-10-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Всем дня!
Добавил переменные для хранения 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]))
также меняет в первом наборе, не меняет во втором.
Значения в переменные присваиваются верные. Вот теперь совсем не понятно, что не так.

Отредактировано rjk (Окт. 28, 2018 12:29:55)

Офлайн

#8 Окт. 28, 2018 12:46:20

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Papa_Svin в ответе #2 дал правильное решение.

Офлайн

#9 Окт. 28, 2018 13:00:12

rjk
Зарегистрирован: 2018-10-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Я не против, но хотелось бы разобраться, почему не работает мой вариант. С первой редакцией более-менее понятно, хотя в туториале емнип было сказано что так можно (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]))
результат тот же.

Офлайн

#10 Окт. 28, 2018 13:58:18

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Почему не работает перестановка min и max?

Самое простое в вашем случае запустить отладку - и выполняя пошагово код - смотреть чему какая переменная у вас равна.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version