[英]Generating a 10-digit password
So I need to generate a 10-digit password (needs to use the random
module) that must contain 2 lower ase letters, 2 uppercase letters, 3 special symbols and 3 numbers all in a random order every time.所以我需要生成一个 10 位密码(需要使用
random
模块),每次必须包含 2 个小写字母、2 个大写字母、3 个特殊符号和 3 个数字,所有这些都以随机顺序排列。 I've got the random password generator part done but I'm not sure how to restrict it to 2 lower case letters, 2 upper case letters, 3 special symbols and 3 numbers.我已经完成了随机密码生成器部分,但我不确定如何将其限制为 2 个小写字母、2 个大写字母、3 个特殊符号和 3 个数字。
This is what I have so far:这是我到目前为止所拥有的:
import random
import string
lc_letter = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
uc_letter = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
symbols = ["!","@","#","$","%","^","&","*","(",")","_","+","=","-","/",">","<",",",".","?","\\"]
numbers = ["0","1","2","3","4","5","6","7","8","9"]
options = [lc_letter,uc_letter,symbols,numbers]
for i in range(10):
choice = random.choice(options)
digit = random.choice(choice)
print(digit, end = '')
An alternative approach that I will suggest is, Take 2 letters from uppercase, lowercase etc. and then shuffle resulting password using random.shuffle
method.我建议的另一种方法是,从大写、小写等中取出 2 个字母,然后使用
random.shuffle
方法对生成的密码进行随机播放。
Pick every needed characters first, then shuffle them:首先选择每个需要的字符,然后将它们洗牌:
from random import choice as rd
from random import shuffle
import string
lc_letter = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
uc_letter = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
symbols = ["!","@","#","$","%","^","&","*","(",")","_","+","=","-","/",">","<",",",".","?","\\"]
numbers = ["0","1","2","3","4","5","6","7","8","9"]
options = [
rd(lc_letter),
rd(lc_letter),
rd(uc_letter),
rd(uc_letter),
rd(symbols),
rd(symbols),
rd(symbols),
rd(numbers),
rd(numbers),
rd(numbers),
]
shuffle(options)
print(''.join(options))
You can use constants from string
:您可以使用
string
中的常量:
import random
import string
s = ""
for i in range(2):
s = s + random.choice(string.ascii_lowercase)
for i in range(2):
s = s + random.choice(string.ascii_uppercase)
for i in range(3):
s = s + random.choice(string.punctuation)
for i in range(3):
s = s + random.choice(string.digits)
s = ''.join(random.sample(s, 10))
print(s)
What you can actually do is pick make a list of length 10 like this:您实际上可以做的是选择制作一个长度为 10 的列表,如下所示:
dist = [0, 0, 1, 1, 2, 2, 2, 3, 3, 3]
This list represents the distribution of each index out of your options
list.此列表表示您的
options
列表中每个索引的分布。 Now you can pick an index in the list:现在您可以在列表中选择一个索引:
idx = random.randint(0, len(dist))
You can pick your choice from options[dist[idx]]
and pop
the value at idx
from dist
.您可以从
options[dist[idx]]
中选择您的选择,然后从dist
pop
idx
的值。
You can use random.choice
, random.sample
, and constants from the string
module to obtain randomly generated passwords.您可以使用
string
模块中的random.choice
、 random.sample
和常量来获取随机生成的密码。
import random
import string
lc_letter = string.ascii_lowercase
uc_letter = string.ascii_uppercase
# Could use string.punctuation here, but it would be different
# as your list doesn't contain semicolons or colons,
# while string.punctuation does.
symbols = ["!","@","#","$","%","^","&","*","(",")","_","+","=","-","/",">","<",",",".","?","\\"]
numbers = string.digits
lc_selection = [random.choice(lc_letter) for _ in range(2)]
uc_selection = [random.choice(uc_letter) for _ in range(2)]
symbol_selection = [random.choice(symbols) for _ in range(3)]
number_selection = [random.choice(numbers) for _ in range(3)]
print(''.join(random.sample(lc_selection + uc_selection + symbol_selection + number_selection, 10)))
An in my opinion better version of Yevgeniy Kosmak's solution (the stand-alone config is clearer to see, the loop avoids code duplication, and using choices
instead of choice
avoids a loop).我认为 Yevgeniy Kosmak 解决方案的更好版本(独立配置更清晰,循环避免了代码重复,使用
choices
而不是choice
避免了循环)。
import random
import string
config = [
(2, string.ascii_lowercase),
(2, string.ascii_uppercase),
(3, string.punctuation), # or use your '!@#$%^&*()_+=-/><,.?\\'
(3, string.digits),
]
picked = []
for k, options in config:
picked += random.choices(options, k=k)
random.shuffle(picked)
password = ''.join(picked)
print(password)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.