Не могу сказать, что не так с простым обменом элементами списка

#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)