如何将变量分配给列表中的元素字符串而不是分别分配给那些元素?
How to assign variable to string of elements in a list rather than those elements separately?
我在将变量分配给特定的元素字符串时遇到了一些麻烦。这是我的代码的简化版本:
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)
下打印所有这些元素=15=] 但第二次它只使用最近的字母。
如何让它打印两次完整的字符串?或者更具体地说,如何让 x
等于整个输出字符串?
我唯一能想到的尝试就是将 x = elem
更改为 x = str(elem)
,但结果相同。
是的,您在这里生成了一个单独的字符列表,因为 random.sample()
always returns 一个列表:
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
列表中的最后一个字符。
您可以直接在 string.ascii_lowercase
上使用 random.sample()
一次 得到相同的结果
w = random.sample(string.ascii_lowercase, random.randint(4, 10))
这仍然是一个列表,但您可以使用 str.join()
:
将结果连接回单个字符串
result = ''.join(w)
现在,通常 当人们从 string.ascii_lowercase
中随机选择字符时,他们不介意字符是否重复。例如,如果这样做,您将获得更好的密码。使用random.choice()
function to pick one random character at a time, and repeat this process in a loop to pick your desired number of letters. A list comprehension可以使这更容易,将所有结果放入一个列表中,你将不得不再次加入结果:
result = ''.join([random.choice(string.ascii_lowercase)
for _ in range(random.randint(4, 10))])
我在将变量分配给特定的元素字符串时遇到了一些麻烦。这是我的代码的简化版本:
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)
下打印所有这些元素=15=] 但第二次它只使用最近的字母。
如何让它打印两次完整的字符串?或者更具体地说,如何让 x
等于整个输出字符串?
我唯一能想到的尝试就是将 x = elem
更改为 x = str(elem)
,但结果相同。
是的,您在这里生成了一个单独的字符列表,因为 random.sample()
always returns 一个列表:
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
列表中的最后一个字符。
您可以直接在 string.ascii_lowercase
random.sample()
一次 得到相同的结果
w = random.sample(string.ascii_lowercase, random.randint(4, 10))
这仍然是一个列表,但您可以使用 str.join()
:
result = ''.join(w)
现在,通常 当人们从 string.ascii_lowercase
中随机选择字符时,他们不介意字符是否重复。例如,如果这样做,您将获得更好的密码。使用random.choice()
function to pick one random character at a time, and repeat this process in a loop to pick your desired number of letters. A list comprehension可以使这更容易,将所有结果放入一个列表中,你将不得不再次加入结果:
result = ''.join([random.choice(string.ascii_lowercase)
for _ in range(random.randint(4, 10))])