分组问题,32个数分8组,每组中数不能有相同的,请用python编程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组问题,32个数分8组,每组中数不能有相同的,请用python编程?相关的知识,希望对你有一定的参考价值。

分组问题:以数字举例,假如我有7个1,4个2,3个3,5个4,7个5,4个6,2个7,如何用python编程,分用8个组,每组中的4个数互不相等。可能分组的结果不唯一,没关系。

#!/usr/bin/env python
# coding: utf-8
"""
分组问题:以数字举例,假如我有7个1,4个2,3个3,5个4,7个5,4个6,2个7,
如何用python编程,分用8个组,每组中的4个数互不相等。
可能分组的结果不唯一,没关系。
"""
datasource = "1": 7, "2": 4, "3": 3, "4": 5, "5": 7, "6": 4, "7": 2
groups = map(lambda x: [], range(8))

def showgroups():
    """show groups
    """
    print "-" * 16
    for group in groups:
        print group

def getrandompos(x):
    """在groups中找到不包含x的最短分组
    """
    return sorted([(i, group) for (i, group) in enumerate(groups)
                               if x not in group],
                   key=lambda (i, group): len(group)
                   )[0][0]


for element, cnts in sorted(datasource.iteritems(),
                            key=lambda x: x[1],
                            reverse=True):
    while cnts:
        R = getrandompos(element)
        if len(groups[R]) < 4 and element not in groups[R]:
            groups[R].append(element)
            cnts -= 1
showgroups()

来自:求助得到的回答
参考技术A 算法可以是这样:把要分组的数据按照其个数多少排序,比如上面是7个1,7个5,5个4,4个2,4个6,3个3,2个7。
然后把这些数依次放入还有空间的组中,每组只放一个。同时尽量保证组的剩余数相同。比如先放7个1,前7组每组一个,放5时从第8个组开始,放了之后再从第一组开始放。追问

你的思路更为简捷易懂,但只能采纳一个回答,仍然感谢你!
为此我这个初学者写了一个程序,请你批评!
不知如何放上来。
===续===
终于搞定了。
请看 http://hi.baidu.com/cnzdzhgzvbgkove/item/1cc8745ca51c11d48c12edd4
另外:如果更进一步,没有哪个小组成员结构一样。即不会出现两个组,都是[1, 5, 4, 6]。那应该如何编程?

追答from operator import itemgetter


def grouping(dataDict):
    keys = [p[0] for p in
            sorted(dataDict.items(), key=itemgetter(1), reverse=True)]
    groups, temp, result = [[[] for i in range(8)]], [], []
    for p in keys:
        num, glen = dataDict[p], len(groups)
        while num:
            if num < glen:
                glen -= 1
                continue
            n = num - glen + 1
            for i in range(n):
                groups[glen - 1][i].append(p)
            temp.append(groups[glen - 1][:n])
            del groups[glen - 1][:n]
            num, glen = num - n, glen - 1
        for lst in temp:
            if len(lst[0]) == 4:
                result += lst
            else:
                groups.append(lst)
        temp = []
        groups = [lst for lst in groups if lst and len(lst[0]) < 4]
        groups.sort(key=len)
    return result


if __name__ == '__main__':
    data = 1: 7, 2: 4, 3: 3, 4: 5, 5: 7, 6: 4, 7: 2
    print(grouping(data))

 算法的主旨是尽可能分散地填充。字数问题,如不理解请问我。

参考技术B 学生分组参加跳绳比赛.按每组6人或每组8人,都能恰好…8518

以上是关于分组问题,32个数分8组,每组中数不能有相同的,请用python编程?的主要内容,如果未能解决你的问题,请参考以下文章

分组批销单模块业务,内部算法

用C语言写:36个数字平均分成4组(每组九个数字)有多少种分法,并显示分组

求算法,将N个整数分到M个数组中,要求元素和相差最小,元素个数相差最小

分组背包

JAVA,用List做,两个数组中数的合并和去除相同元素

AreYouBusy (混合背包)