如何从列表中创建唯一的非重复对组合

时间:2016-09-16 21:14:27

标签: python itertools

我是计算机编程的新手。

我想从一个偶数编号的球员名单(最多32个)创建连续的2人球队,但在所有可能的球队成立之前没有重复。

例如对于6名玩家(通过f)我可以使用itertools.combinations 15个不同的团队生成。然后我可以手动,在纸上,在矩阵中创建5组3个独特的团队(即[['a','b'],['c','d'],['e','f'] ]和类似的ac,bf,de; ae,bc,df; af,bd,ce和ad,be,cf)。但我一直无法在python 3.5中编写程序(许多不同的尝试)来执行此操作。经过5次或更少的迭代后,我得到了重复,并且根本没有创建一些可能的团队。

我进行了搜索,但无法确定哪种解决方案适用于我的特定情况。

2 个答案:

答案 0 :(得分:0)

如果您只需要某些完整的循环配对,那么请使用"循环赛锦标赛计划"查找解决方案。您可以在Wikipedia上使用久经考验的解决方案。

将玩家分为两行,每行一半,如下:

A  B  C
D  E  F

你的第一对配对是AD,BE,CF。接下来,钉上 A ,并将其他人视为戒指:

A   B  C
   D    F
     E

将环顺时针旋转一个位置......

A   D  B
   E    C
     F

...再将下三部分压成一行:

A  D  B
E  F  C

你的第二轮配对是AE,DF,BC。 继续进行共五次旋转;最后一个恢复原来的配对。

答案 1 :(得分:0)

这是我想要完成的典型场景: 名单上约有26名球员 第1周:第26周出现。我组建了9支球队 第2周:第26周出现。我组建了11支队伍,但第1周没有重复 第3周:第26周出现。我组建了5支队伍,但没有从第1周或第2周开始重复,等等。

以下作品虽然没有应用过去的球队过滤器,但最多可以有12名球员(需要25秒),但超过12名球员的时间长得令人难以忍受,而且我预计大约有24名球员。 该程序选择第一组有效的团队然后结束。随着应用额外的past__teams过滤器 - 程序的整个点 - 它将不得不运行更长时间。 是否有另一种方法可以解决这个问题或者加速它的方法呢?

from itertools import combinations, chain
import pickle, random
'''the'past__teams.py' file was previously created as follows:
output = open('past__teams.pkl', 'wb')
pickle.dump(past__teams, output)
output.close()'''
players = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
random.shuffle(players)
#load the past__teams file into the program
pkl_file = open('past__teams.pkl', 'rb')
past__teams = pickle.load(pkl_file)
pkl_file.close()

all_pair_combinations= []
tonights_teams = []
for c in combinations(players, 2):
    c = list(c)
    all_pair_combinations.append(c)

def dupe_test(L):
    if len(L) != len(set(L)):
        return True
    return False
y = 0
for t in combinations(all_pair_combinations, int(len(players)/2)):
    t = list(t)
    tt =list(chain(*t))
    y = y +1
    if dupe_test(tt) == False:
        tonights_teams =t
        break
print ()
print ("Tonights_teams: ",y,tonights_teams)