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
. Мой код выходит из границы строки. Пожалуйста, предложите мне более эффективный подход к этой проблеме
Строки неизменяемы в 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
Вот как я это сделаю:
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.
for j in range(0, len(temp)/2):
:?len(temp)/2)
имеет типfloat
. А где,if (i+j)%2 == 0
в вашем коде?