Как поменять символ строки с заданным условием? - PullRequest
0 голосов
/ 10 октября 2018
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.Мой код выходит за границы строки.Пожалуйста, предложите мне лучший подход к этой проблеме

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вот как я могу это сделать:

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)
  • Преобразование строк в списки, выполнение подкачки и обратное преобразование.
  • Использование операции типа "swap" вместо двух replace s.
0 голосов
/ 10 октября 2018

Строки являются неизменными в 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
...