如何简化有关 python 中迭代组合的代码



所以我下面有我创建的这段代码。此代码将列出某个值的每个可能组合,在本例中为"a"b"c"d"。如果我使用此代码,结果将是这样的:a,aa,ab,ac,ad,aaa,aab,aac,aad,aba,abb,abc等。如何简化循环代码,以便我可以输入更多值而无需创建更多 for 循环?

n = "abcd"
for c in n:
    print(c)
    for c1 in n:
        print(c+c1)
        for c2 in n:
            print(c+c1+c2)
            for c3 in n:
                print(c+c1+c2+c3)

https://docs.python.org/2/library/itertools.html

Itertools的排列和组合是你所追求的。

itertools.permutations([1, 2, 3])
from itertools import combinations
n = "abcd"
print ([''.join(l) for i in range(len(n)) for l in combinations(n, i+1)])

输出:

['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'bd', 'cd', 'abc', 'abd', 'acd', 'bcd', 'abcd']

编辑:

from itertools import combinations_with_replacement
n = "abcd"
comb = []
for i in range(1, len(n)+1):
    comb += list(combinations_with_replacement(n, i))
print([''.join(c) for c in comb])

输出:

['a', 'b', 'c', 'd', 'aa', 'ab', 'ac', 'ad', 'bb', 'bc', 'bd', 'cc', 'cd', 'dd', 'aaa', 'aab', 'aac', 'aad', 'abb', 'abc', 'abd', 'acc', 'acd', 'add', 'bbb', 'bbc', 'bbd', 'bcc', 'bcd', 'bdd', 'ccc', 'ccd', 'cdd', 'ddd', 'aaaa', 'aaab', 'aaac', 'aaad', 'aabb', 'aabc', 'aabd', 'aacc', 'aacd', 'aadd', 'abbb', 'abbc', 'abbd', 'abcc', 'abcd', 'abdd', 'accc', 'accd', 'acdd', 'addd', 'bbbb', 'bbbc', 'bbbd', 'bbcc', 'bbcd', 'bbdd', 'bccc', 'bccd', 'bcdd', 'bddd', 'cccc', 'cccd', 'ccdd', 'cddd', 'dddd']

要获得 340 个元素的相同结果,您可以使用 itertools.product

product(n, repeat=1)
product(n, repeat=2)
...
product(n, repeat=4)

要打印结果,您可以使用以下循环:

from itertools import product
n = "abcd"
for i in range(1, 5):  
    for prod in product(n, repeat=i): 
        print(''.join(prod)) 

要获得额外的级别,您可以轻松增加 5 英寸range。注意:打印顺序与代码中的顺序略有不同。

您可以使用 itertools 模块来解决您的问题。您需要combinations_with_replacement所有可能长度的函数:

import itertools as it
n = "abcd"
result = []
for l in range(len(n)):
    result += list(it.combinations_with_replacement(n, l+1))
print(result)

[('a',), ('b',), ('c',), ('d',), ('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('c', 'c'), ('c', 'd'), ('d', 'd'), ('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'), ('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]

最新更新