我正在尝试在不使用random.shuffle()
的情况下对字符串“string”进行加密,但我的代码会继续生成缺少和重复字符的输出,例如gtrgtg,gnrtnn等我不确定我做错了什么。
import random
s = "string"
new_s=[]
for c in s:
if random.choice(s) not in new_s:
new_s.append(random.choice(s))
print(''.join(new_s))
答案 0 :(得分:2)
在当前状态下,程序会检查随机选择的字符是否在字符串中。如果是,除了继续循环之外它不会做任何事情。此外,由于您未将random.choice(s)
分配给变量,因此在执行检查后会生成另一个字符。
工作版本将是:
import random
s = "string"
new_s = []
for c in s:
char = random.choice(s) # assign it to a variable
while char in new_s: # until a new character comes, repeat the procedure
char = random.choice(s)
new_s.append(char)
print(''.join(new_s))
这会生成ngtsri
,gsrnit
等字符串。请注意,如果原始字符串中有重复项,则无法使用此字符串。
以上代码效率极低。假设这是出于学习目的,我只给出了修正。通常,如果要反复检查集合中是否存在某些内容,则该集合应该是集合或字典。
答案 1 :(得分:1)
random.choice
从字符串s
中选择一个随机字符,但不删除它 - 因此可以多次选择相同的字符,并且不能选择某些字符所有
import random
s = 'string'
new_s = []
# rather than choosing a character, chose an index, use it and slice it out
while s:
i = random.randint(0, len(s)-1)
new_s.append(s[i])
s = s[:i] + s[i+1:]
print(''.join(new_s))
# this is more elegant with lists:
s = list(s)
while s:
i = random.randint(0, len(s)-1)
new_s.append(s.pop(i))
print(''.join(new_s))
这两种选择都不是很有效......但为了提高效率,请使用random.shuffle
。 :)
答案 2 :(得分:1)
使用while
,您可以遍历s
,直到new_s
的长度与s
的长度匹配,并且结果字符串具有非重复字符。
import random
s = "string"
new_s = '' # So you will not need ''.join() when you print this result
while len(new_s) != len(s):
char = random.choice(s)
if char not in new_s:
new_s += char
print(new_s)
rntigs
>>>
答案 3 :(得分:0)
试试这个:
from random import randint
def shuffle(sr):
n = len(sr)
s = list(sr)
for i in range(n):
cur, idx = s[i], randint(0, n - 1)
s[i], s[idx] = s[idx], cur
return ''.join(s)
print(shuffle("hello"))