如何将变量分配给列表中的元素字符串而不是单独分配这些元素?

时间:2016-05-13 06:37:32

标签: python string python-3.x random element

我在将变量分配给特定的元素字符串方面遇到了一些麻烦。这是我的代码的简化版本:

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),但结果却相同。

1 个答案:

答案 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))])