2

replace()用来扭曲数据,我希望有一个“高失真”设置,每个实例都被替换,一个“低失真”设置,每个实例有 50% 的机会被替换。例如:

x = "aaaaaaaaaa"
x = x.replace("a", "b")
'bbbbbbbbbb'

x = "aaaaaaaaaa"
x = x.5050replace("a", "b")
'aabbabbaab'

没有重写replace(),有人怎么能做到这一点?

4

3 回答 3

4

使用随机模块:

import random
x = ''.join(i if random.randint(0, 1) else 'b' for i in x)

这段代码本质上“替换”了xif中的每个字母,random.randint计算结果为0with '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.randintreturns 0,就像前面的示例一样。

于 2013-01-19T05:23:13.190 回答
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'
于 2013-01-19T05:59:03.353 回答
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))
于 2013-01-19T06:02:40.097 回答