Python 如何从列表中创建唯一的非重复对组合
我是计算机编程新手 我想从一个偶数最多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次或更少的迭代之后,我得到了重复,一些可能的团队根本没有创建 我做了一次搜索,但无法完全辨别哪种解决方案适用于我的具体情况。如果您需要的只是一些完整的循环配对,请使用循环比赛计划查找解决方案。您很可能只需要使用上面所示的久负盛名的解决方案 将玩家分两行列出,每行一半,如下所示: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次或更少的迭代之后,我得到了重复,一些
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等的建议。您应该能够以这种方式进行编辑。在编辑窗口中,将鼠标悬停在顶部的图标上;小的帮助框告诉你他们做什么。