почему нельзя сделать своп к списку - PullRequest
0 голосов
/ 10 марта 2020

Попытка поменять местами все гласные в строке, оригинальная строка ниже. Я поместил индексы всех гласных и их аналогов в список кортежей.

s =['a', 'd', 'e', 'f', 'i', 'g', 'u', 'k', 'o']
e = [(0, 8), (2, 6), (4, 4), (6, 2), (8, 0)]

for el in e:
    old = el[0]
    new = el[1]

    s[old], s[new] = s[new], s[old]#this does not work

print(s)

Я хотел, чтобы s стал:

['o', 'd', 'u', 'f', 'i', 'g', 'e', 'k', 'a']

поменяйте местами a и o, e и u.

но строка не изменилась.

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Все, что вы поменялись, вы поменяли местами дважды ... Если вы поменяете местами 0 с 8, затем 8 с 0, вы вернете все обратно в исходный порядок.

Не делайте свопы дважды для одних и тех же элементов.

1 голос
/ 10 марта 2020

Вы можете преобразовать сопоставление в диктовку обратного просмотра, чтобы можно было соответственно отображать индексы списка, если он в сопоставлении:

mapping = dict(map(reversed, e))
print([s[mapping.get(i, i)] for i in range(len(s))])

Это выводит:

['o', 'd', 'u', 'f', 'i', 'g', 'e', 'k', 'a']
1 голос
/ 10 марта 2020

Вы перебираете весь список, поменяете местами первое с последним и затем последнее с первым, чтобы вернуться к начальной точке. Перейдите к середине списка:

for old, new in e[:len(e) // 2]:
    s[old], s[new] = s[new], s[old]
...