【问题标题】:Creating a text file filled with custom formatted text创建一个填充自定义格式文本的文本文件
【发布时间】:2021-05-10 22:48:34
【问题描述】:

我正在尝试创建一个密码列表,其中包含以下格式的所有组合:

3 个字符 2 个数字 3 个字符

例如:aaa00aaabbb11bbb

我创建了一个代码,它使用较小的字符数组,但是当我尝试使用 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 python-3.x passwords combinations


    【解决方案1】:

    可以使用pythonitertools模块生成组合。

    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,它确实应该是所有排列(而不是组合)。我更新了代码。

    【讨论】:

    • 我认为你需要排列而不是组合,它应该是 30.891.577.600 种可能的组合。
    • 是的,我更新了答案,感谢您的关注。
    • 感谢您的回答。我不知道 itertools 并试图自己创建一切。这让我的工作变得更轻松了。
    【解决方案2】:

    你的问题是你对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()
    

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多