如何使用数组元素生成所有组合并使用itertools而不是for?

时间:2017-12-15 18:23:05

标签: python itertools

我如何使用itertools或有效地执行此操作?该列表的长度为557845

#Generate all combinations of 4 elements and put on list    
listLol=list(map("".join, itertools.combinations('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',4)))
#This is too slow
    for a in listLol:
        for b in listLol:
            for c in listLol:
                for d in listLol:
                    for e in listLol:
                        cadena="SomeString-"+a+"-"+b+"-"+c+"-"+d+"-"+e

1 个答案:

答案 0 :(得分:0)

您确实可以使用itertools.product执行此操作。

IllAdvised = ["SomeString-" + "-".join(i) for i in itertools.product(listLol, repeat=5)]

您还可以考虑itertools.combinations_with_replacement而不是简单itertools.combinations来生成原始列表。 编辑: itertools.product也可能是你想要的原始列表。如果是这种情况,那么您可以直接使用itertools.product(alphabetALPHABET, repeat=20)。 (当然alphabetALPHABET是你的原始字符串。)

然而,无论你如何做到这一点,都需要花费很长时间。您的列表中有557845 ^ 5个元素,如果您使用combinations_with_replacementitertools.product,则可能是7311616 ^ 5。这个新列表中超过10 ^ 28个元素。即使您避免使用生成器的内存问题:

for i in itertools.product(listLol, repeat=5): 
   cadena="SomeString-" + "-".join(i)
   #do something with cadena

此循环的运行时将超过Universe的当前年龄。无论您对语言的了解程度如何,或者您应用何种小优化,这个障碍都是难以处理的。我建议你尝试不同的方法。