无法改变迭代的字符串

时间:2014-04-11 13:55:55

标签: python string

我试图用循环改变一串位(参见下面的代码),但输入和输出是相同的。

    bitstring = "100111001101010101010101"
    print("old genome :  " + bitstring)
    for bit in bitstring:

        if random.random() < 1:
            print("old bit :  " + bit)
            bit = flipBit(bit)
            print("new bit :  " + bit)


    bitstring= "".join(bitstring)
    print("new genome :  " + bitstring)

这给了我输出

old genome = 100111001101010101010101
new genome = 100111001101010101010101

我已检查(使用代码中的print语句)flipBit()函数是否有效。并且接缝正在工作......但是,输入的bitstring和输出是相同的。


我想做的是拒绝概率,例如

if random.random() < 0.05:

这样只有少数位发生变异。

3 个答案:

答案 0 :(得分:1)

在python中,字符串是不可变的,这意味着您无法执行以下操作:

>> hello = "hello"
>>> for letter in hello:
    letter = 'a'


>>> hello
'hello'

在上面的例子中,letter只是一个新的标识符,分配给单词hello的当前迭代中的字母值。因此,您可以使用该标识符执行任何操作,但这并不意味着它将更改hello

在尝试加入之前,您需要将字符串转换为列表,即

>>> new_word = []
>>> for letter in hello:
    if letter == 'h':
        new_word.append('a')
    else:
        new_word.append(letter)


>>> print ''.join(new_word)
aello

答案 1 :(得分:1)

问题在于:

for bit in bitstring:

    if random.random() < 1:
        print("old bit :  " + bit)
        bit = flipBit(bit)
        print("new bit :  " + bit)

当你这样做时:

bit = flipBit(bit)

您不会更改bitstring中的位,而是将另一个值(由flipBit返回)命名为bit

试试这个:

muted_bitstring = ""
for index, bit in enumerate(bitstring.spli()):

    if random.random() < 1:
        muted_bitstring += = flipBit(bit)

bitstring = muted_bitstring

答案 2 :(得分:0)

删除答案后,这是一个有效的实施方案:

import random

bitstring = "100111001101010101010101"
print("old genome :  " + bitstring)
newGenome="".join(["10"[int(bit)] if random.random() < 0.05 else bit for bit in bitstring])
print("new genome :  " + newGenome)