随机选择字符串中元素的百分比并更改值

时间:2018-10-25 17:44:21

标签: python

我有点刺痛,需要随机替换5%的元素,如果元素为1,则将其翻转为0,如果元素为0,则将其翻转为1。

我有一个看起来像这样的字符串:

'10011110110001000111010011010100101100100110111000010001111100001010000011101100011110100110001110010101010000100111000101001100100110110010010100000010111110000011001001011011010111111010001011101011110100000101010110100001001011010000111110101011001101011000100100010010100011100001011011110001010101010101100001111111010101000010011010010110111100011111001011100101001000101011110000010111101111101100010010010011011101101110110000000000101010101010101011111011010111000101010010001010110011101011'

有效地,字符串中5%的值将从0更改为1,反之亦然。

我已经尝试过了,但是它似乎不起作用,并且不能保证只替换5%的元素:

for i in range(500):
    if random.random() < 0.05:
        if test[i] == '1':
            test[i] == '0'
        else:
            test[i] == '1'

2 个答案:

答案 0 :(得分:1)

您需要更改两件事

  1. 字符串是不可变的。因此,test = list(test)在循环之前,test = ''.join(test)在循环之后
  2. 预先选择要更改的元素

首先,选择n个随机索引。一种选择是使用random.choice 替换

 num_elements = int(0.05 * len(test))
 indexes = random.choice(list(range(len(test)), num_elements, replace=False)

,然后像以前一样修改值。

答案 1 :(得分:0)

这将适用于Python 2.7和3.6(经过测试;也可能是更新的)。

import random
sting = '10011110110001000111010011010100101100100110111000010001111100001010000011101100011110100110001110010101010000100111000101001100100110110010010100000010111110000011001001011011010111111010001011101011110100000101010110100001001011010000111110101011001101011000100100010010100011100001011011110001010101010101100001111111010101000010011010010110111100011111001011100101001000101011110000010111101111101100010010010011011101101110110000000000101010101010101011111011010111000101010010001010110011101011'
sting = ''.join([chr(ord(y) ^ 1) if x in random.sample(range(len(sting)),len(sting)//20) else y for x,y in enumerate(list(sting))])
print (sting)

我已经尝试过并且可以正常工作,并且保证只替换5%的元素。

它将精确地切换5%(sting的长度除以20,即5%)从01以及从1到{ {1}},没有重复项。切换是通过XOR运算符完成的,random.sample选择索引来替换“唯一元素”,即没有重复。