我replace()
用来扭曲数据,我希望有一个“高失真”设置,每个实例都被替换,一个“低失真”设置,每个实例有 50% 的机会被替换。例如:
x = "aaaaaaaaaa"
x = x.replace("a", "b")
'bbbbbbbbbb'
x = "aaaaaaaaaa"
x = x.5050replace("a", "b")
'aabbabbaab'
没有重写replace()
,有人怎么能做到这一点?
使用随机模块:
import random
x = ''.join(i if random.randint(0, 1) else 'b' for i in x)
这段代码本质上“替换”了x
if中的每个字母,random.randint
计算结果为0
with 'b'
,并保持原样。
如果您的字符串很复杂,'aacakedaaasa'
并且您只想替换'a'
s,请尝试以下操作:
x = ''.join(i if i != 'a' or random.randint(0, 1) else 'b' for i in x)
如果字母 is not ,则不执行任何操作'a'
,如果是,则将其替换为'b'
if random.randint
returns 0
,就像前面的示例一样。
您可以使用random.choice从您的字符串和b
大小相等的字符串中构建一个新列表
>>> from random import sample
>>> x = "aaaaaaaaaa"
>>> ''.join(random.sample(x + "b"*len(x), len(x)))
'baabbbbbba'
注意这比使用 with 理解字符串快两倍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'
这是波动率答案的变体,可让您指定百分比
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))