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

Python 如何从列表中创建唯一的非重复对组合,python,itertools,Python,Itertools,我是计算机编程新手 我想从一个偶数最多32人的球员名单中创建一个连续的2人团队,但在所有可能的团队组成之前,不要重复 例如,对于6名玩家,我可以使用itertools.15个不同的团队组合生成a到f。然后我可以在纸上,在矩阵中手动创建5组3个独特的团队SI.e。[a'、[b']、[c'、[d']、[e'、[f']以及类似的ac、bf、de;ae,bc,df;af、bd、ce和ad、be、cf。但是我一直无法用python 3.5编写一个程序来实现这一点。在5次或更少的迭代之后,我得到了重复,一些

我是计算机编程新手

我想从一个偶数最多32人的球员名单中创建一个连续的2人团队,但在所有可能的团队组成之前,不要重复

例如,对于6名玩家,我可以使用itertools.15个不同的团队组合生成a到f。然后我可以在纸上,在矩阵中手动创建5组3个独特的团队SI.e。[a'、[b']、[c'、[d']、[e'、[f']以及类似的ac、bf、de;ae,bc,df;af、bd、ce和ad、be、cf。但是我一直无法用python 3.5编写一个程序来实现这一点。在5次或更少的迭代之后,我得到了重复,一些可能的团队根本没有创建

我做了一次搜索,但无法完全辨别哪种解决方案适用于我的具体情况。

如果您需要的只是一些完整的循环配对,请使用循环比赛计划查找解决方案。您很可能只需要使用上面所示的久负盛名的解决方案

将玩家分两行列出,每行一半,如下所示:

A  B  C
D  E  F

你最初的配对是AD,be,f..其次,把A钉在适当位置,并把其他的作为一个环:

A   B  C
   D    F
     E
将环顺时针旋转一个位置

A   D  B
   E    C
     F
。。。将下面的三个再展平为一行:

A  D  B
E  F  C
你的第二轮配对是AE,DF,BC。
继续此操作,共旋转五圈;最后一个将恢复原始配对。

以下是我试图实现的一个典型场景: 约26名球员的名册 第1周:26人中的18人出现。我组成9队 第2周:26次中的22次出现。我组成了11支球队,但从第一周开始没有重复 第3周:26人中的10人出现。我组建了5个团队,但从第1周或第2周开始没有重复训练,以此类推

下面的工作,虽然没有应用过去的团队过滤器,但最多12名球员需要25秒,但超过12名的时间太长,我预计大约24名球员。 程序选择第一组有效的团队,然后结束。由于应用了额外的过去团队过滤器——程序的全部要点——它将不得不运行更长的时间。 有没有其他方法解决这个问题,或者有什么方法可以大大加快速度

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)

让我们检查X-Y问题状态:这的最终目的是什么?您是否正在尝试为2N名玩家建立一个完整的循环配对?这是一个稍微不同的问题,但有已知的解决方案。如果您需要以一种不太有序的方式完成算法,正如您的描述所暗示的,那么我们有一个稍微困难一些的问题。请分享您的尝试,即使它们不起作用。这正是堆栈溢出的原因。感谢您的回复。我想提交我的代码以及我试图完成的典型场景。我可以从我的文本编辑器Wingware 101复制代码并粘贴它,使其与您的答案一样显示在阴影框中吗?我不理解有关反勾号、Ctrl-K等的建议。您应该能够以这种方式进行编辑。在编辑窗口中,将鼠标悬停在顶部的图标上;小的帮助框告诉你他们做什么。