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

Posted

技术标签:

【中文标题】如何从列表中创建唯一的非重复对组合【英文标题】:How can I create unique non-repeating pair combinations from a list 【发布时间】:2016-09-16 21:14:26 【问题描述】:

我是计算机编程的新手。

我想从偶数的玩家列表(最多 32 人)中创建连续的 2 人团队,但在所有可能的团队成立之前不重复。

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

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

【问题讨论】:

让我们检查一下“X-Y”问题状态:这样做的最终目的是什么?您是否尝试为 2N 名玩家设置完整的循环配对?这是一个稍微不同的问题,但有已知的解决方案。如果您需要按照您的描述以不那么有序的方式完成算法,那么我们有一个稍微困难的问题。 请分享您的尝试,即使它们不起作用。这正是 Stack Overflow 的用途。 【参考方案1】:

如果您只需要一些完整的循环赛配对,则使用“循环赛赛程表”查找解决方案。您很可能只使用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。 继续这个总共五轮;最后一个恢复了原来的配对。

【讨论】:

感谢您的回复。我想提交我的代码以及我想要完成的典型场景。我可以从我的文本编辑器(Wingware 101)中复制代码并将其粘贴,使其与您的答案一样出现在阴影框中吗?我不明白关于反引号、Ctrl-K 等的建议。 您应该能够以这种方式进行编辑。当您在编辑窗口中时,将鼠标悬停在顶部的图标上;小帮助框会告诉您它们的作用。【参考方案2】:

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

以下作品,尽管(还)没有应用 past__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)

【讨论】:

以上是关于如何从列表中创建唯一的非重复对组合的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串列表中创建一个字符串? [复制]

在C中创建n个项目的k和m个组合的所有可能子集[重复]

如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]

如何在python中反转字典并从重复的键值中创建一个列表

如何在 SSMS 2012 中创建唯一约束 [重复]

从python列表中获取元素的唯一组合[重复]