Python替换字符串中的3个随机字符,不能有重复字符。

5
我需要使用Python更改字符串中的3个随机字符,例如字符串:
Adriano Celentano 
Luca Valentina

我需要替换3个字符,不能替换为相同的字符或数字,也不能替换空格。我该如何使用Python实现这一点?
需要输出类似于这样的结果:
adraano cettntano
lacr vilenntina

我不知道从哪里开始制作这个。

目前为止我的代码:

for i in xrange(4):
    for n in nume :
        print n.replace('$', random.choice(string.letters)).replace('#', random.choice(string.letters))

1
你为什么要循环4次,'$''#'又是如何参与其中的? - Padraic Cunningham
2个回答

6

如果您只想更改非空格字符并且不考虑索引相同的字符,可以首先提取非空格字符所在的索引:

import random
inds = [i for i,_ in enumerate(s) if not s.isspace()]

print(random.sample(inds,3))

然后使用这些索引进行替换。
s = "Adriano Celentano"
import random
inds = [i for i,_ in enumerate(s) if not s.isspace()]
sam = random.sample(inds, 3)
from string import ascii_letters

lst = list(s)
for ind in sam:
    lst[ind] = random.choice(ascii_letters)

print("".join(lst))

如果你想每次用一个唯一的字符替换,可以使用以下方法:
s = "Adriano Celentano"
import random
from string import ascii_letters
inds = [i for i,_ in enumerate(s) if not s.isspace()]

sam = random.sample(inds, 3)

letts =  iter(random.sample(ascii_letters, 3))
lst = list(s)
for ind in sam:
    lst[ind] = next(letts)

print("".join(lst))

输出:

Adoiano lelenhano

不要排除数字和空格,我认为最安全的方法是仅包含字母,可以通过set('your string...') & set('abcdef...')实现。 - Andrea Corbellini
@AndreaCorbellini,这取决于OP想要替换什么,问题中存在一些不确定性,关于他们实际想要替换的内容。 - Padraic Cunningham
set('your string') & set(string.ascii_uppercase + string.ascii_lowercase)甚至可以。 - dwanderson
如果字符串包含空格和标点符号,那么 "inds = [i for i,_ in enumerate(s) if _.isalpha()]" 怎么办? - Mark K

0

您可以分两个阶段完成此操作。第一阶段,您需要在字符串中选择符合搜索条件(isalnum)的3个随机位置:

import random
import string
replacement_chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# replacement_chars = string.letters + string.digits
input = 'Adriano Celentano'
input_list = list(input) 
input_dic = dict(enumerate(input_list))
valid_positions=[key for key in input_dic if input_dic[key].isalnum()]
random_positions=random.sample(valid_positions,3)

在第二部分中,您需要生成3个随机字符并替换先前选择的位置中的字符。我已经添加了一个while循环来生成新的随机字符,如果它与现有值匹配。
random_chars = random.sample(replacement_chars,len(random_positions)) 
char_counter = 0
for position in random_positions:   
    #check if the replacement character matches the existing one
    #and generate another one if needed
    while input_list[position]==random_chars[char_counter]:
        random_chars[char_counter] = random.choice(replacement_chars)    
    input_list[position]=random_chars[char_counter]    
    char_counter = char_counter + 1
print "".join(input_list).lower()

当你只想要一个元素时,为什么要使用random.sample - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接