我有一个X元素的列表。我需要产生所有可能的组合(不重复),并把这些项目放入独特的元素组。组中的元素数量应该是声明性的。例如,如果我有一个4个元素的列表,想要每个组有2个项目,它应该是这样的:
l = [1, 2, 3, 4]
所有的组合
1 2
1 3
1 4
2 3
2 4
3 4
我的组
group 1
1 2
3 4
group 2
1 3
2 4
group 3
1 4
2 3
容易的部分已经完成了
from itertools import combinations
all_items = [1, 2, 3, 4]
cm = list(combinations(all_items, 2))
print('total combinations [{}]: {}'.format(len(cm), cm))
但是这个任务剩下的部分的解决方案是什么呢? 问题来源StackOverflow 地址:/questions/59466898/combinations-without-repetition-then-split-result-into-groups-of-unique-elements
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要完成这个任务,你需要在生成所有可能的组合之后,将这些组合分成具有独特元素组的多个组。这里是一个使用Python实现的解决方案:
from itertools import combinations
def split_combinations_into_groups(cm, group_size):
# 确保组合数量能被组大小整除,否则会有剩余组合无法平均分配
if len(cm) % group_size != 0:
raise ValueError("Combination count is not divisible by the group size.")
# 计算每组应有多少个组合
combinations_per_group = len(cm) // group_size
# 初始化结果列表,用于存放分组后的组合
grouped_cm = [[] for _ in range(group_size)]
# 遍历所有组合并将其均匀分配到各个组中
for idx, combo in enumerate(cm):
# 计算当前组合应归属的组号
group_index = idx // combinations_per_group
grouped_cm[group_index].append(combo)
return grouped_cm
# 已经生成的组合
all_items = [1, 2, 3, 4]
cm = list(combinations(all_items, 2))
# 分组
grouped_combinations = split_combinations_into_groups(cm, 2)
print('Grouped Combinations:')
for i, group in enumerate(grouped_combinations, start=1):
print(f'Group {i}: {group}')
这段代码首先定义了一个split_combinations_into_groups
函数,它接收两个参数:一个是所有组合的列表(cm
),另一个是希望每个组包含的组合数(group_size
)。函数内部计算了每个组应该包含多少个组合,并通过遍历所有组合,根据其索引值来决定该组合属于哪个组,最后返回一个二维列表,其中每个子列表代表一个组及其包含的组合。
注意,此方案假设组合总数能够被组的数量整除,如果不满足这一条件,程序会抛出一个错误。在实际应用中,你可能需要根据具体需求调整错误处理逻辑。