2013-01-19 3 views
2

J'utilise replace() pour déformer les données, et je voudrais avoir un paramètre "haute distorsion" où chaque instance est remplacée, et un réglage "faible distorsion" où il y a 50% de chance que chaque instance soit remplacée. Par exemple:Remplacer 50% de caractères (aléatoirement) dans une chaîne

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

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

Sans re-écrire replace(), comment quelqu'un pourrait le faire?

Répondre

4

Utilisez le module random:

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

Ce code essentiellement «remplace chaque lettre x si random.randint est évaluée à 0 avec 'b', et il laisse comme il en est autrement.

Si votre chaîne est quelque chose pour compliqué comme 'aacakedaaasa' et que vous voulez remplacer les 'a' s, essayez ceci:

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

Cela ne fait rien si la lettre n'est pas 'a', et si il est, puis le remplace par 'b' si random.randint renvoie 0, comme l'exemple précédent.

+0

Vous n'avez pas besoin des supports - ça va aussi bien travailler sans elle. – DSM

+0

@DSM bien sûr, oublié à ce sujet, merci pour le rappel, cependant! – Volatility

+0

Cela donnera un remplacement de presque 50% mais pas exact 50% de remplacement – Abhijit

0

Vous pouvez utiliser random.choice pour construire une nouvelle liste à partir d'une population de votre chaîne et une chaîne de b s de taille égale

>>> from random import sample 
>>> x = "aaaaaaaaaa" 
>>> ''.join(random.sample(x + "b"*len(x), len(x))) 
'baabbbbbba' 

Remarque C'est deux fois plus rapide par rapport à comprendre la chaîne en utilisant avec 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 

Au lieu de cela, si vous voulez un 50% Replac exacte estion, vous pouvez utiliser random.shuffle

>>> x = "aaaaaaaaaa" 
>>> x = list(x[:len(x)/2] + 'b'*(len(x)/2)) 
>>> random.shuffle(x) 
>>> x = ''.join(x) 
>>> x 
'bbbaabbaaa' 
0

Ceci est une variante de la réponse de la volatilité qui vous permet de spécifier un pourcentage

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)) 
Questions connexes