How do I generate a random string (of length X, a-z only) in Python?
Possible Duplicate:
python random string generation with upper case letters and digits
如何在python中生成长度为x a-z的字符串?
- @我不明白,这不是堆栈溢出的本质吗?在帮助网站上抱怨似乎很奇怪。
1
| ''.join(random.choice(string.lowercase) for x in range(X)) |
- 很好地使用了生成器表达式。但是当我们保存内存时,最好使用xrange而不是range。
- 细胞因子风暴,从python 3.x开始,range()的行为与xrange()相同。
- 请记住,随机模块生成的任何序列都不是加密安全的。
- @费德里科:除非你使用random.SystemRandom(),它应该像操作系统支持的那样加密安全。在需要加密随机性的模块中,我经常这样做:import random,random = random.SystemRandom(),用提供OS加密随机性的类的实例替换模块。SystemRandom是random.RandomAPI,由os.urandom提供随机性,而不是mersenne twister(os.urandom由window的CryptGenRandom和unix的/dev/urandom等支持)。
如果不想重复:
1 2
| import string, random
''.join(random.sample(string.ascii_lowercase, X)) |
如果你想要(潜在的)重复:
1 2
| import string, random
''.join(random.choice(string.ascii_lowercase) for _ in xrange(X))) |
假设a-z的意思是"ascii小写字符",否则这些表达式中的字母表达可能会有所不同(例如,string.lowercase表示"与区域设置相关的小写字母",根据您当前的区域设置,这些字母可能包括重音或其他修饰的小写字母)。
- 仅供参考,string.lowercase很少超过ascii,但是您根据我的经验设置了区域设置。我只是注意到"当前字母表"没有真正的变量。
- 这些代码示例都不表示唯一性。这里有一个测试:pastie.org/8619409
- @阿尔泰索特:你误解了sample的工作原理。它只画一次任何给定的字符,但没有按顺序画。因此,abc和cba将是不同的输出。您的测试只有在假设sample以与原始字符串中出现的顺序相同的顺序返回它们时才有效(可能会有大量的重叠),但由于它们可以以任何顺序出现,因此存在(26+7)! / 7!选项;重叠不常见。