Как поменять символ строки с заданным условием?

1
def password(passlist):

    listt = []
    for i in range(0, len(passlist)):
        temp = passlist[i]

    for j in range(0, len(temp)/2):
        if((j+2)%2 == 0) :
                t = temp[j]
                temp.replace(temp[j], temp[j+2])
                temp.replace(temp[j+2], t)  
    listt.append(temp)

Я передаю список примеров строк ["abcd", "bcad"]. для каждой строки i меняет i й символ с j символом, если (i+j)%2 == 0. Мой код выходит из границы строки. Пожалуйста, предложите мне более эффективный подход к этой проблеме

  • 1
    Строки являются неизменяемыми, поэтому temp.replace` также не будет работать.
  • 0
    Как вы прошли через for j in range(0, len(temp)/2): :? len(temp)/2) имеет тип float . А где, if (i+j)%2 == 0 в вашем коде?
Показать ещё 3 комментария
Теги:
string
list
swap

2 ответа

0
Лучший ответ

Строки неизменяемы в python, поэтому вы не можете поменять символы на месте. Вы должны построить новую строку.

Более того, ваш код не работает для каждой строки в passlist. Вы перебираете строку в passlist в первом for блока, но затем используете переменную temp вне этого блока. Это означает, что второй цикл for выполняет только итерацию в последней строке.

Теперь способ сделать то, что вы хотите, может быть:

for i in range(len(passlist)):
    pass_ = passlist[i]
    new_pass = [c for c in pass_] # convert the string in a list of chars
    for j in range(len(pass_) / 2):
        new_pass[j], new_pass[j+2] = new_pass[j+2], new_pass[j] # swap

    listt.append(''.join(new_pass)) # convert the list of chars back to string
  • 0
    Спасибо за вашу помощь, ваш код отлично работает как для четной, так и для нечетной строки
  • 0
    Можете ли вы принять мой ответ тогда? Было бы очень признательно
Показать ещё 1 комментарий
0

Вот как я это сделаю:

def password(passlist):
    def password_single(s):
        temp = list(s)

        for j in range(0, len(temp) // 2, 2):
            temp[j], temp[j+2] = temp[j+2], temp[j]

        return ''.join(temp)

    return [password_single(s) for s in passlist]

print(password(["abcd", "bcad"]))
  • Определите функцию, которая работает с одним элементом списка (password_single). Легче его разрабатывать и отлаживать. В этом случае я сделал его внутренней функцией, но это не обязательно.
  • Используйте вызовы range с тремя аргументами, поскольку они аналогичны двум аргументам + if(index%2 == 0)
  • Преобразуйте строки в списки, выполните обмен и конвертируйте обратно.
  • Используйте операцию типа "своп" вместо двух replace s.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню