创建一个包含自定义格式文本的文本文件
Creating a text file filled with custom formatted text
我正在尝试创建一个包含以下格式的所有组合的密码列表:
3个字符2个数字3个字符
示例:aaa00aaa
bbb11bbb
我已经创建了一个代码来处理较小的字符数组,但是当我尝试使用 ASCII 系统中的所有字符时,代码会出现内存错误。
import string
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
characterCombs = []
numbCombs = []
allCombs = []
for el1 in characters:
for el2 in characters:
for el3 in characters:
characterCombs.append(el1+el2+el3)
for n1 in numbers:
for n2 in numbers:
numbCombs.append(n1 + n2)
for ch1 in characterCombs:
for no in numbCombs:
for ch2 in characterCombs:
allCombs.append(ch1+no+ch2)
for i in allCombs:
f.write(i+"\n")
f.close()
有没有办法优化这段代码,或者我应该改变我的方法并找到不同的方法来组合所有这些字符?
您可以使用 python itertools
模块来生成组合。
from itertools import permutations
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
for a in permutations(characters, 3):
for b in permutations(numbers, 2):
for c in permutations(characters, 3):
print("".join(a + b + c))
虽然这会花费很多时间...
另外,您不需要保留所有生成密码的列表。您可以在生成密码时将密码写入文件中的 for 循环中。
编辑:
正如下面提到的@Andreas,它确实应该是所有的排列(而不是组合)。我更新了代码。
你的问题是你对for
的作用缺乏理解。
出于某种原因,您认为它会随机选择一个值,但事实并非如此。 for
循环遍历给定可迭代对象中的每个元素。
根据第一部分的结果有多大,你会得到一个内存错误是有道理的。
for el1 in characters:
for el2 in characters:
for el3 in characters:
characterCombs.append(el1+el2+el3)
这里发生的事情是这样的:
el1 = "a"
el2 = "a"
el3 = "a"
characterCombs[aaa]
el3 = "b"
characterCombs[aaa, aab]
el3 = "c"
characterCombs[aaa, aab, aac]
...
el2 = "b"
el3 = "a"
characterCombs[aaa, aab, aac, ..., aba]
使用随机化很容易解决这个问题。这是使用 random.choice
import random
def main():
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
pass_format = ((3, characters), (2, numbers), (3, characters))
pass_choices = tuple(random.choice(lst[1]) for lst in pass_format for _ in range(lst[0]))
print(pass_choices)
if __name__ == '__main__':
main()
它打印:
('r', 'w', 'c', '3', '9', 'n', 'j', 'x')
另一种选择,使用random.choices:
def main():
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
pass_format = ((3, characters), (2, numbers), (3, characters))
pass_choices = []
for section in pass_format:
pass_choices.extend(random.choices(section[1], k=section[0]))
print(pass_choices)
if __name__ == '__main__':
main()
我正在尝试创建一个包含以下格式的所有组合的密码列表:
3个字符2个数字3个字符
示例:aaa00aaa
bbb11bbb
我已经创建了一个代码来处理较小的字符数组,但是当我尝试使用 ASCII 系统中的所有字符时,代码会出现内存错误。
import string
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
characterCombs = []
numbCombs = []
allCombs = []
for el1 in characters:
for el2 in characters:
for el3 in characters:
characterCombs.append(el1+el2+el3)
for n1 in numbers:
for n2 in numbers:
numbCombs.append(n1 + n2)
for ch1 in characterCombs:
for no in numbCombs:
for ch2 in characterCombs:
allCombs.append(ch1+no+ch2)
for i in allCombs:
f.write(i+"\n")
f.close()
有没有办法优化这段代码,或者我应该改变我的方法并找到不同的方法来组合所有这些字符?
您可以使用 python itertools
模块来生成组合。
from itertools import permutations
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
for a in permutations(characters, 3):
for b in permutations(numbers, 2):
for c in permutations(characters, 3):
print("".join(a + b + c))
虽然这会花费很多时间...
另外,您不需要保留所有生成密码的列表。您可以在生成密码时将密码写入文件中的 for 循环中。
编辑:
正如下面提到的@Andreas,它确实应该是所有的排列(而不是组合)。我更新了代码。
你的问题是你对for
的作用缺乏理解。
出于某种原因,您认为它会随机选择一个值,但事实并非如此。 for
循环遍历给定可迭代对象中的每个元素。
根据第一部分的结果有多大,你会得到一个内存错误是有道理的。
for el1 in characters:
for el2 in characters:
for el3 in characters:
characterCombs.append(el1+el2+el3)
这里发生的事情是这样的:
el1 = "a"
el2 = "a"
el3 = "a"
characterCombs[aaa]
el3 = "b"
characterCombs[aaa, aab]
el3 = "c"
characterCombs[aaa, aab, aac]
...
el2 = "b"
el3 = "a"
characterCombs[aaa, aab, aac, ..., aba]
使用随机化很容易解决这个问题。这是使用 random.choice
import random
def main():
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
pass_format = ((3, characters), (2, numbers), (3, characters))
pass_choices = tuple(random.choice(lst[1]) for lst in pass_format for _ in range(lst[0]))
print(pass_choices)
if __name__ == '__main__':
main()
它打印:
('r', 'w', 'c', '3', '9', 'n', 'j', 'x')
另一种选择,使用random.choices:
def main():
numbers = ["0","1","2","3","4","5","6","7","8","9"]
characters = ["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"]
pass_format = ((3, characters), (2, numbers), (3, characters))
pass_choices = []
for section in pass_format:
pass_choices.extend(random.choices(section[1], k=section[0]))
print(pass_choices)
if __name__ == '__main__':
main()