生成 list/string 的每个可能的长度为 1..n 的子集
Generate every possible subset of length 1..n of list/string
问题
我有一个字符串,我想为它找到长度为 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))
如您所见,至少可以说这是不可扩展的。有没有好的方法来做到这一点?任何复杂性的降低也会很酷,尽管我很难想象。
使用 python 我建议从 1 到 n 遍历 i,每次迭代从 1 到 n-i 遍历 j,并在每次迭代中打印从 j 开始到 j+i 结束的子字符串.
substring 在 python 中有点奇怪所以你必须 "slice" 它从 j 到 -(n-(j+i)).
这大约是您想要的,尽管您可能需要调整边项。
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..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))
如您所见,至少可以说这是不可扩展的。有没有好的方法来做到这一点?任何复杂性的降低也会很酷,尽管我很难想象。
使用 python 我建议从 1 到 n 遍历 i,每次迭代从 1 到 n-i 遍历 j,并在每次迭代中打印从 j 开始到 j+i 结束的子字符串. substring 在 python 中有点奇怪所以你必须 "slice" 它从 j 到 -(n-(j+i)).
这大约是您想要的,尽管您可能需要调整边项。
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']