#python
#python
Вопрос:
Мне нужно поменять местами элементы в списке в определенном порядке, который задается per
. Мне нужно начать с и поменять местами каждый последующий элемент с ‘9’.
ini_nos = [3, 10, 1, 8, 9, 4, 2, 7, 6, 5]
x = 9
y = 9
per = {
1: 5,
5: 2,
2: 10,
10: 9,
9: 1}
for i in range(5):
ini_nos[ini_nos.index(y)] = per[x]
ini_nos[ini_nos.index(per[x])] = y
x = per[x]
Когда я бегу
print(ini_nos[ini_nos.index(y)], "=>", per[x])
print(ini_nos[ini_nos.index(per[x])], "=>>", y)
в каждом цикле он выводит правильные значения, но они никогда не изменяются в ini_nos
списке, за исключением первого обмена.
Что я делаю не так?
ini_nos
После завершения скрипта должно выглядеть так: ini_nos = [3, 9, 5, 8, 1, 4, 10, 7, 6, 2]
Комментарии:
1. Это не так, но спасибо за ссылку.
2. Я хочу знать, почему мой не работает, поскольку это делается так же, как и в ссылке.
3. Редактировать: добавлена цель
ini_nos
.4. Не следует ли вам затем заменить
y
наx
в вашем цикле?5. Изначально это выглядело так, но я хочу каждый раз менять местами с ‘9’, поэтому я хотел оставить его постоянным, а тот, который он заменяет переменной.
Ответ №1:
это требует больше ресурсов памяти из-за скорости O (N).
print([per[t] if t in per else t for t in ini_nos])
пошаговый обмен, меньший объем памяти, но O (N ^ 2)
x,y=9,9
for cnt in range(5):
y=per[y]
px=ini_nos.index(x)
py=ini_nos.index(y)
ini_nos[px],ini_nos[py]=y,x
Комментарии:
1. Хотя это потрясающе и действительно работает, мне нужно добавить некоторый код, который рассчитывал бы стоимость каждого обмена, и я не уверен, что он подойдет для вас.
2. Это работает! По-видимому, ключевым моментом является назначение индексов отдельно. Не могли бы вы все же объяснить, как это O (n ^ 2)? Это должно быть O (n) .
3. Это цикл из N шагов, и каждый индекс равен O (N), поэтому общее значение равно O (N2). Вы можете кэшировать один из вызовов индекса между итерациями, чтобы сэкономить половину времени, но все равно O (N2)