繁体   English   中英

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

[英]How can I create unique non-repeating pair combinations from a list

我是计算机编程的新手。

我想从偶数编号的球员列表(最多 32 名)创建连续的 2 人团队,但在所有可能的团队都形成之前不重复。

例如,对于 6 个玩家(a thru 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 次或更少的迭代之后,我得到了重复,并且根本没有创建一些可能的团队。

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

如果您所需要的只是一些完整的循环配对,那么请使用“循环比赛时间表”查找解决方案。 您可能只需使用在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。 继续这样做,总共旋转五次; 最后一个恢复原始配对。

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

下面的作品,虽然没有应用过去的__teams 过滤器(还),最多 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM