我有点刺痛,需要随机替换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'
答案 0 :(得分:1)
您需要更改两件事
test = list(test)
在循环之前,test = ''.join(test)
在循环之后首先,选择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%)从0
到1
以及从1
到{ {1}},没有重复项。切换是通过XOR运算符完成的,random.sample选择索引来替换“唯一元素”,即没有重复。