我使用replace()
来扭曲数据,并且我希望有一个"高失真"设置每个实例被替换的地方,以及"低失真"设置每个实例被替换的可能性为50%。例如:
x = "aaaaaaaaaa"
x = x.replace("a", "b")
'bbbbbbbbbb'
x = "aaaaaaaaaa"
x = x.5050replace("a", "b")
'aabbabbaab'
如果没有重写replace()
,有人会怎么做?
答案 0 :(得分:4)
使用random模块:
import random
x = ''.join(i if random.randint(0, 1) else 'b' for i in x)
如果x
使用random.randint
评估为0
,则此代码基本上“替换”'b'
中的每个字母,并保留原来的字样。
如果你的字符串是'aacakedaaasa'
之类的复杂内容而你只想替换'a'
,那么试试这个:
x = ''.join(i if i != 'a' or random.randint(0, 1) else 'b' for i in x)
如果字母不是'a'
,则不会执行任何操作,如果是,则如果'b'
返回random.randint
,则将其替换为0
,例如上一个例子。
答案 1 :(得分:0)
您可以使用random.choice从字符串填充中创建一个新列表,并使用大小相同的b
字符串
>>> from random import sample
>>> x = "aaaaaaaaaa"
>>> ''.join(random.sample(x + "b"*len(x), len(x)))
'baabbbbbba'
注意与使用random.randint
>>> stmt_ab = "''.join(random.sample(x + 'b'*len(x), len(x)))"
>>> stmt_v = "''.join(i if random.randint(0, 1) else 'b' for i in x)"
>>> import timeit
>>> t1_v = timeit.Timer(stmt_v,setup="from __main__ import x, random")
>>> t1_ab = timeit.Timer(stmt_ab,setup="from __main__ import x, random")
>>> t1_v.timeit(100000)
2.749679788532113
>>> t1_ab.timeit(100000)
1.3974490402988167
相反,如果您想要完全替换50%,则可以使用random.shuffle
>>> x = "aaaaaaaaaa"
>>> x = list(x[:len(x)/2] + 'b'*(len(x) / 2))
>>> random.shuffle(x)
>>> x = ''.join(x)
>>> x
'bbbaabbaaa'
答案 2 :(得分:0)
这是波动率答案的变体,可让您指定百分比
def replace_ramd(input_string, pct):
for r in range(len(input_string)):
yield input_string[r] if random.randint(0,100) > pct else chr(random.randint(64,127))