【问题标题】:trying to write a list of all possible 4 characters combinations in Python尝试在 Python 中编写所有可能的 4 个字符组合的列表
【发布时间】:2020-05-12 21:29:37
【问题描述】:

基本上我希望所有可能的 4 个字符组合都写在一个 txt 文件中 问题是应该允许重复,我想要组合 1111,2222... 您认为我哪里出错了,您将如何解决?

import itertools
import sys
import os

tester = open(r"available.txt","a")
lol =[]
a = [1,2,3,4,5,6,7,8,9,0,'_','.','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']

lol=list(itertools.combinations(a, 4))
for comb in lol:
    tester.write(str(comb)+"\n")

【问题讨论】:

  • 该代码需要永远执行哈哈哈
  • 'available.txt' 现在有 2.7GB 的大小,这正在杀死我的笔记本电脑
  • 您将 200 万个项目的列表分配 200 万次。
  • 刚刚修复了抱歉,bois
  • 尝试重现您的问题。你的数据太大了。处理循环需要很长时间。

标签: python itertools


【解决方案1】:

使用替换组合 - 101270 个条目:(立即运行,不包括文件 IO)

import itertools
with open('available.txt', 'w') as f:
    lol = []
    a = [i for i in '1234567890._abcdefghijklmnopqrstuvwxyz']
    lol = list(itertools.combinations_with_replacement(a, 4))
    for comb in lol:
        f.write(comb)

无替换组合 - 73815 个条目:(立即运行,不包括文件 IO)

import itertools
with open('available.txt', 'w') as f:
    lol = []
    a = [i for i in '1234567890._abcdefghijklmnopqrstuvwxyz']
    lol = list(itertools.combinations(a, 4))
    for comb in lol:
        f.write(comb)

无需替换的排列 - 1771560 个条目:(立即运行,不包括文件 IO)

import itertools
with open('available.txt', 'w') as f:
    lol = []
    a = [i for i in '1234567890._abcdefghijklmnopqrstuvwxyz']
    lol = list(itertools.permutations(a, 4))
    for comb in lol:
        f.write(comb)

带有替换的排列 - 2085136 个条目:(在大约 2 秒内运行,不包括文件 IO)

lol = []
for a in '1234567890._abcdefghijklmnopqrstuvwxyz':
    for b in '1234567890._abcdefghijklmnopqrstuvwxyz':
        for c in '1234567890._abcdefghijklmnopqrstuvwxyz':
            for d in '1234567890._abcdefghijklmnopqrstuvwxyz':
                lol.append(a+b+c+d)
with open('my_dump.txt', 'w') as f:
    f.write(repr(lol))

您很可能需要替换排列,因为您指定了38^4 总可能性。 (下次使用术语排列!)切掉此列表中的前 100 个条目:

>>> lol[:100]
['1111', '1112', '1113', '1114', '1115', '1116', '1117', '1118', '1119', '1110', '111.', '111_', '111a', '111b', '111c', '111d', '111e', '111f', '111g', '111h', '111i', '111j', '111k', '111l', '111m', '111n', '111o', '111p', '111q', '111r', '111s', '111t', '111u', '111v', '111w', '111x', '111y', '111z', '1121', '1122', '1123', '1124', '1125', '1126', '1127', '1128', '1129', '1120', '112.', '112_', '112a', '112b', '112c', '112d', '112e', '112f', '112g', '112h', '112i', '112j', '112k', '112l', '112m', '112n', '112o', '112p', '112q', '112r', '112s', '112t', '112u', '112v', '112w', '112x', '112y', '112z', '1131', '1132', '1133', '1134', '1135', '1136', '1137', '1138', '1139', '1130', '113.', '113_', '113a', '113b', '113c', '113d', '113e', '113f', '113g', '113h', '113i', '113j', '113k', '113l']

【讨论】:

  • 字母 = 列表(string.digits + '_.' + string.ascii_lowercase)
【解决方案2】:

运行这个几乎把我的笔记本电脑炸了。

对代码的一些改进:

  1. 不要使用tester.write(comb),因为您不能将tuple 写入文件。只有字符串 (str)。所以我决定使用tester.write(str(comb))

  2. 您可能应该找到一种更好的方法来做您想做的任何事情,因为创建这种大小的文件并几乎杀死笔记本电脑的方法可能不是最有效的方法^^

    李>

改进的代码:

#! /usr/bin/python3

import itertools
import sys
import os

tester = open(r"available.txt","a")
lol =[]
a = ['1','2','3','4','5','6','7','8','9','0','_','.','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']

lol=list(itertools.combinations(a, 4))

for comb in lol:
    tester.write(str(comb))

【讨论】:

  • 你为什么要编写一个包含 200 万个条目的 200 万个实例?当我第一次测试它时,它占用了 2.7GB,差点让我崩溃
  • @EricJin 是的,它也确实让我崩溃了......那个循环在他最初上传的代码中,我复制了它,只是注意到它很愚蠢。谢谢!
猜你喜欢
  • 2015-09-18
  • 2018-09-25
  • 2015-05-06
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多