我在将变量分配给特定的元素字符串方面遇到了一些麻烦。这是我的代码的简化版本:
import random
import string
def printsl(string):
import sys
sys.stdout.write(string)
sys.stdout.flush()
l = random.sample(string.ascii_lowercase, 26)
w = random.sample(l, random.randint(4, 10))
for elem in w:
x = elem #<-------
printsl(x)
print('')
printsl(x)
当我运行此代码时,输出就像
那样npabjcevz
z
或
znoyhe
e
等
第一行输出是我想要的,但由于某种原因,第二行只打印字符串的最后一个字母。如果我错了,请纠正我,但我猜测它是因为它不是elem
等于整个随机元素串,而是将它重新分配给4-10个不同的元素并打印所有这些元素printsl(x)
下的for elem in w
,但第二次只使用最近的一封信。
如何让它两次打印完整的字符串?或者更具体地说,我如何让x
等于整个输出字符串?
我唯一能想到的就是将x = elem
更改为x = str(elem)
,但结果却相同。
答案 0 :(得分:2)
是的,您在这里生成一个单独的字符列表,因为random.sample()
总是返回一个列表:
l = random.sample(string.ascii_lowercase, 26)
w = random.sample(l, random.randint(4, 10))
第一行从序列string.ascii_lowercase
中选择26个唯一且随机字符的列表。输入也是26个字符长意味着你基本上已经产生了一个随机改组的26个字母的字母。然后第二行从该洗牌列表中选择4到10个字符,然后重新洗牌。
使用自定义的printls
函数会使您自己感到困惑,该函数在打印完所有内容后不添加换行符,因此for elem in w:
循环打印的每个字符都会出现在前一个字符之后。当循环完成时,for
循环变量elem
最终被绑定到w
列表中的最后一个字符。
您可以直接在random.sample()
string.ascii_lowercase
一次来获得相同的结果
w = random.sample(string.ascii_lowercase, random.randint(4, 10))
这仍然是一个列表,但您可以将结果重新加入到包含str.join()
的单个字符串中:
result = ''.join(w)
现在,通常当人们从string.ascii_lowercase
中挑选随机字符时,如果字符重复,他们就不会介意。例如,如果你这样做,你将获得更好的密码。使用random.choice()
function一次选择一个随机字符,然后循环重复此过程以选择所需的字母数。 list comprehension可以使这更容易,将所有结果放入列表中,您必须再次加入结果:
result = ''.join([random.choice(string.ascii_lowercase)
for _ in range(random.randint(4, 10))])