如何在给定条件下交换字符串的字符?

时间:2018-10-10 14:06:15

标签: python string list swap

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 :(得分: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

答案 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