生成列表/字符串的长度1..n的每个可能子集

时间:2015-07-11 22:50:57

标签: python-3.x for-loop nested-loops

问题

我有一个字符串,我希望找到每个可能的长度1..n。

的子集

示例

给出字符串" abc"和n=3,我想产生以下列表:

{"a", "b", "c", "aa", "ab", "ac", "ba", ..., "aaa", "aab", "aac", "aba" ..., "ccc"}

我的尝试

......是一个痛苦的新手。每个n一个循环,嵌套n次。

对于n = 3,我有:

characters = "abcdef" # and so on

for char in characters:
    print(char)

for char1 in characters:
    for char2 in characters:
        print(str(char1) + str(char2))

for char1 in characters:
    for char2 in characters:
        for char3 in characters:
            print(str(char1) + str(char2) + str(char3))

正如您所看到的,至少可以说这是不可扩展的。有一个很好的方法来做到这一点?任何复杂性的减少也会很酷,虽然我很难想象任何。

2 个答案:

答案 0 :(得分:2)

itertools.product就是您所需要的。使用"".join"将字符连接成一个字符串。

>>> import itertools
>>> n = 3
>>> s = "abc"
>>> for i in range(n):
    print(["".join(prod) for prod in itertools.product(s, repeat = i + 1)])


['a', 'b', 'c']
['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

答案 1 :(得分:1)

使用python我建议在i上从1循环到n,并且每次迭代循环j从1到n-i,并且在每次迭代中打印从j开始并在j + i结束的子串。 子串在python中有点奇怪,所以你必须将它从j切片到 - (n-(j + i))。

这大概是您想要的,但您可能需要调整边缘术语。