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

0 python string random

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

我用它来生成密钥(从这个站点抓住谢谢:))

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

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

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

有什么建议?

Jon*_*nts 6

把它们放在一个列表中,然后使用randomshuffle来犯错,然后将它们随机混乱,然后将它们连接起来制作一个字符串.

import string
import random

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


DSM*_*DSM 5

我会用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#'
Run Code Online (Sandbox Code Playgroud)

你保证永远不会有重复——假设原始是唯一的,也就是说,这可以通过调用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
Run Code Online (Sandbox Code Playgroud)