创建一个包含自定义格式文本的文本文件

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()