【发布时间】:2019-04-16 08:20:47
【问题描述】:
假设我有“堆栈”这个词,它的每个字母都有一个数字,用于定义字母必须重复的次数。在 JSON 文件中,我将拥有以下内容:
{
"s": 4,
"t": 3,
"a": 2,
"c": 5,
"k": 2
}
由此我想生成所有可能组合的完整树,即:
Depth 1: stack
Depth 2: stack, sstack, ssstack, sssstack
Depth 3: stack, sttack, stttack, sstack, ssttack, sstttack,ssstack, sssttack, ssstttack, sssstack, ssssttack, sssstttack
Depth 4: ... with 'a'
Depth 5: ... with 'c'
Depth 6: ... with 'k'
这将给出 4*3*2*5*2 = 240 种可能性。另外,我从几天前在这里问过的人那里获得了这些功能,并且我对其进行了一些修改:
def all_combinations(itr):
lst = list(itr)
for r in range(1, len(lst) + 1):
for perm in itertools.combinations(lst, r=r):
yield perm
def all_repeats(n, letters, word):
for rep in all_combinations(letters):
yield ''.join(char * n if char in rep else char for char in word)
这给了我:
word = 'stack'
for i in range(1,5):
liste.append(''.join(list(all_repeats(i, ['s'], word))))
Output: ['stack', 'sstack', 'ssstack', 'sssstack']
据此,在给定 JSON 文件中的一对(字母、数字)的情况下,我如何递归调用此函数来创建所有可能性?
【问题讨论】:
-
请注意,字典通常不被认为是“有序的”,因此您很容易以
ackst作为答案...将选项保存在列表列表中(即 [['s ',3],['t',3]]) 会更好地与常见语义对齐(@987654326@ 确实存在,但使用更合适的数据类型通常更容易) -
@SamMason 我不知道我的回答是否正确,但我似乎没有问题阅读 JSON 文件,即使我有重复的条目,我也可以设法删除它们。我想循环遍历 JSON 文件中的每个字母和数字,并给出一个我会做的列表“mylist”:
mylist.append(''.join(list(all_repeats(number, letter, word))))
标签: python string list combinations