在Python中创建随机字符串而不重复字符

时间:2013-09-09 19:45:37

标签: python string random

所以我正在做的是创建一个使用string.digits + string.ascii_letters + string.punctuation

的94char密钥

我用这个来生成密钥(从这个站点获取谢谢:))

def key_pass(size=94, chars=string.digits + string.ascii_letters + string.punctuation):
    return ''.join(random.choice(chars) for x in range(size))

创建这样的东西 9bMMqy-lB6Mt},bOxr@1ljey_\Z\gk`xRJBP;3YFR*i<N<!MB}_|0p3f5Q"l8'xEj)WHYGk7O]vQZ1cZ'(diMKS*gW%u$

我真正想要做的是随机组织chars var中的94个字符。所以我不能有任何重复我只是似乎无法正确的方法来实现一个检查变量的if语句

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

将它们放入一个列表中,然后使用random shuffle来犯错,然后将它们随机播放,然后将它们连接起来制作一个字符串。

import string
import random

all_chars = list(string.digits + string.ascii_letters + string.punctuation)
random.shuffle(all_chars)
print ''.join(all_chars[:94])

答案 1 :(得分:4)

我会使用random.sample

>>> import string, random
>>> chars=string.digits + string.ascii_letters + string.punctuation
>>> ''.join(random.sample(chars, 4))
'e_/p'
>>> ''.join(random.sample(chars, 10))
'a4NSq`%tQ#'

你保证永远不会有重复 - 假设原件是唯一的,也就是说,这可以通过调用set来确保;关键是chars的相同元素永远不会被绘制两次。 random.sample("aa", 2)["a", "a"]。如果你要求的元素比你多,你会得到一个很好的错误:

>>> ''.join(random.sample(chars, 100))
Traceback (most recent call last):
  File "<ipython-input-9-80959adcfe83>", line 1, in <module>
    ''.join(random.sample(chars, 100))
  File "/usr/lib/python2.7/random.py", line 320, in sample
    raise ValueError("sample larger than population")
ValueError: sample larger than population