2016-09-16 12 views
-3

我是計算機編程的新手。如何從列表中創建獨特的非重複對組合

我想從偶數編號的球員列表中創建連續的2人團隊(最多32人),但是不會重複,直到所有可能的球隊形成爲止。

例如對於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次或更少的迭代後,我得到重複,一些可能的球隊根本不會創建。

我做了一個搜索,但不能完全明白哪個解決方案適用於我的具體情況。

+1

讓我們來檢查「X-Y」問題狀態:這是什麼目的?你是否想爲2N玩家建立一個完整的循環配對?這是一個稍微不同的問題,但已知的解決方案。如果您需要按照您的描述所暗示的那樣以不太有序的方式處理算法,那麼我們會遇到一個稍微困難的問題。 – Prune

+0

請分享你的嘗試,即使他們不工作。這正是Stack Overflow的作用。 –

回答

0

如果您只需要一些完成循環配對,然後使用「循環賽比賽時間表」查找解決方案。您可能只需使用Wikipedia上的長期已知解決方案。

名單的球員在兩排,每排有一半,像這樣:

A B C 
D E F 

你先配對是AD,BE,CF.接下來,指甲一個到位,並考慮其他如環:

A B C 
    D F 
    E 

環順時針一個位置旋轉......

A D B 
    E C 
    F 

...壓平低三成一排再次:

A D B 
E F C 

你的第二輪配對是AE,DF,BC。 繼續這個總共五次旋轉;最後一個恢復原始配對。

+0

感謝您的回覆。我想提交我的代碼以及我正在嘗試完成的典型場景。我是否可以從我的文本編輯器(Wingware 101)中複製代碼並粘貼它,使其出現在陰影框中,就像您的答案一樣?我不明白關於反引號,Ctrl-K等的建議。 – user5339671

+0

你應該可以用這種方式進行編輯。當你在編輯窗口中時,將鼠標懸停在頂部的圖標上;小小的幫助框會告訴你他們做了什麼。 – Prune

0

下面是我想要完成的一個典型場景: 約26名球員名冊 第1周:26的18出現。我組成9支球隊 第2周:26場比賽中有22場出現。我組成11支球隊,但從第1周開始沒有重複。 第3周:26中有10人出現。我組成了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) 
相關問題