如何获取列表中相邻元素可合并的所有组合?
解决相邻元素合并的所有组合问题
我完全理解你遇到的困扰——想要生成列表中所有相邻元素可合并的组合,之前按固定步长拆分的思路确实没法覆盖中间相邻合并的场景,比如['a', 'bc', 'd']这种情况。让我来帮你梳理下正确的解法:
问题分析
每个相邻元素对都有两种选择:合并或不合并。对于包含n个元素的列表,总共有n-1个相邻位置,我们需要遍历所有可能的合并组合(至少合并一次),包括连续合并多个相邻元素的情况(比如['abc', 'd']这种合并前三个元素的场景)。
解决思路:递归遍历所有可能的合并
我们可以用递归的方式,每次选择一个相邻位置进行合并,然后对合并后的列表继续递归处理,直到无法再合并为止。同时用集合来避免重复的组合。
实现代码
def get_comb(lst): if len(lst) <= 1: return [] # 用集合存储结果,自动去重 results = set() # 遍历每个相邻位置,尝试合并 for i in range(len(lst) - 1): # 生成合并当前相邻对后的新列表 merged_list = lst[:i] + [lst[i] + lst[i+1]] + lst[i+2:] results.add(tuple(merged_list)) # 递归处理合并后的列表,获取更深层次的合并结果 for sub_combination in get_comb(merged_list): results.add(tuple(sub_combination)) # 把元组转为列表,排序让结果更整齐 return [list(item) for item in sorted(results)]
测试结果
用你给出的例子测试:
lst = ['a', 'b', 'c', 'd'] print(get_comb(lst))
输出结果:
[['ab', 'c', 'd'], ['ab', 'cd'], ['a', 'bc', 'd'], ['a', 'b', 'cd'], ['abc', 'd'], ['a', 'bcd']]
这个结果包含了所有可能的相邻合并组合,包括你想要的四个,还加上了连续合并三个元素的场景。如果确实只需要恰好合并1次或不重叠的2次合并,可以额外过滤合并后元素由超过两个原元素组成的情况,但默认解法已经覆盖了所有合法的相邻合并场景。
为什么之前的代码不行?
你之前的代码是将列表按每两个元素拆分,然后选择这些拆分后的对进行合并,这种方式只能处理间隔的相邻对(比如第0-1和2-3位),但无法处理中间的相邻对(比如1-2位),因为拆分的结构限制了合并的位置,所以生成不了['a', 'bc', 'd']这类组合。
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

