python – 将所有可能的点组合分组,分为m组

我想将所有可能的点组合分组为r组.

Points = [A,B,C,D……..] Total n points

一次取m的这些点的组合将是列表l

l = list(itertools.combinations(points,m))

如何进一步将其分组为r组,使得每组的第i个元素没有相似的点.

例如,

Points = [A,D] m = 2 and r = 2

l = [[A,B],[A,C],D],[B,[C,D]]

所以小组会

Group 1 = [[A,D]] and corresponding to it Group 2 =
[[C,C]]

注意:组1和组2的第i个索引中的点没有相似的点.

我希望一次获取m个点并将其分组为r组.

请提供我的算法.

另请注意,当点数增加时,如果我们想要超过2组,可能的组合也会增加.

解决方法

这是一个棘手的问题!我实施了一个天真的蛮力解决方案.这可能太慢了,但这是一个起点.

from itertools import combinations,permutations

points = 'ABCDEF'
r = 3
m = len(points) // r
all_combinations = list(combinations(points,m))
group_length = len(all_combinations) // r
assert r * group_length == len(all_combinations)
found = set()

for combinations_permutation in permutations(all_combinations):
    groups = [combinations_permutation[group_length * i: group_length * (i + 1)]
              for i in range(r)]
    transpose = zip(*groups)

    # Avoid very similar-looking solutions
    canonical = frozenset(map(frozenset,transpose))

    if (canonical not in found and
            all(len(col) == len(set(col))
                for col in (sum(column,()) for column in transpose))):
        found.add(canonical)
        for group in groups:
            print ','.join(map(''.join,group))
        print '----'

这是输出的开始:

AB,AC,AD,AE,AF
CD,BE,BF,BD,BC
EF,DF,CE,CF,DE
----
AB,BC,BD
EF,DE,CE
----
AB,AF
CE,BC
DF,EF,CD,BE
DF,CD

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...