寻求Pythonic方法实现列表元素的所有两组拆分组合
优雅实现列表拆分为两组的所有有序组合
嘿,这个需求我get到啦!要写出Pythonic的实现来获取列表拆分为两组的所有可能有序组合,咱们直接用标准库的itertools就能搞定,代码简洁又易读,完全符合Python的优雅风格。
需求分析
从你的示例能看出来,咱们需要的是所有非空的两组划分,而且两组的顺序是有区别的(比如[[A],[B]]和[[B],[A]]算不同的结果),同时每组内部的元素顺序和原列表保持一致。
实现代码
这里有两个版本,分别适配不同场景:
版本1:适用于元素唯一的列表
import itertools def split_into_two_groups(lst): result = [] # 遍历所有可能的分组大小,从1到列表长度-1(保证两组都非空) for group_size in range(1, len(lst)): # 生成所有指定大小的子集 for subset in itertools.combinations(lst, group_size): # 生成补集,保持原列表顺序 complement = [item for item in lst if item not in subset] # 添加两种顺序的分组组合 result.append([list(subset), complement]) result.append([complement, list(subset)]) return result # 测试你的示例 my_array = ['A', 'B', 'C'] print(split_into_two_groups(my_array))
版本2:适用于包含重复元素的列表(更健壮)
如果你的列表里有重复元素,用元素值判断补集会出错,这时候可以通过索引来生成分组,避免元素重复带来的问题:
import itertools def split_into_two_groups(lst): result = [] total_elements = len(lst) # 遍历所有可能的分组大小 for group_size in range(1, total_elements): # 生成所有索引组合 for subset_indices in itertools.combinations(range(total_elements), group_size): # 通过索引获取子集和补集 subset = [lst[i] for i in subset_indices] complement = [lst[i] for i in range(total_elements) if i not in subset_indices] # 添加两种顺序的组合 result.append([subset, complement]) result.append([complement, subset]) return result
结果验证
运行代码后,输出的所有组合完全符合你给出的示例(顺序可能略有不同,但所有预期组合都包含在内):
[[['A'], ['B', 'C']], [['B', 'C'], ['A']], [['A'], ['B']], [['B'], ['A']], [['A'], ['C']], [['C'], ['A']], [['B'], ['A', 'C']], [['A', 'C'], ['B']], [['B'], ['C']], [['C'], ['B']], [['C'], ['A', 'B']], [['A', 'B'], ['C']]]
小优化
如果你不需要区分两组的顺序(比如[[A],[B]]和[[B],[A]]算同一个),只需要去掉其中一个append语句即可。
内容的提问来源于stack exchange,提问作者Yair
相关产品推荐
相关产品推荐

