2017-08-30 73 views
0

這是我的代碼,它可以從多個成員中創建分組,然後對每個分組進行評分,然後對它們進行評分,以獲得這種情況下4個分組的總分。返回分數

import random 

def run(members, n_groups): 
    participants = list(range(1,members+1))*n_groups 
    random.shuffle(participants) 

    my_groups = list(zip(*[iter(participants)]*members)) 
    print(my_groups) 

    def get_rating(group): 
     return (len(set(group))) 

    score = ((sum(get_rating(g) for g in my_groups))) 
    print(score) 
    return score 

members = 4 
n_groups = 4 

print(min(run(members, n_groups) for _ in range(10))) 

輸出:

[(3, 3, 4, 1), (4, 2, 3, 1), (2, 3, 2, 4), (1, 1, 4, 2)] 
13 
[(3, 1, 1, 4), (2, 3, 2, 4), (1, 4, 1, 2), (3, 2, 4, 3)] 
12 
[(2, 4, 4, 1), (3, 3, 1, 3), (3, 1, 2, 2), (4, 4, 2, 1)] 
11 
[(3, 1, 4, 1), (3, 1, 2, 1), (2, 2, 4, 4), (3, 2, 3, 4)] 
11 
[(1, 1, 3, 1), (2, 2, 3, 1), (3, 2, 4, 4), (4, 4, 3, 2)] 
11 
[(3, 2, 1, 2), (4, 1, 3, 4), (4, 2, 3, 1), (1, 2, 4, 3)] 
14 
[(2, 4, 3, 1), (3, 4, 4, 2), (1, 1, 2, 1), (3, 3, 4, 2)] 
12 
[(3, 3, 1, 2), (2, 1, 3, 3), (2, 4, 4, 2), (4, 1, 1, 4)] 
10 
[(1, 4, 3, 2), (4, 2, 3, 3), (3, 1, 2, 1), (4, 4, 1, 2)] 
13 
[(2, 4, 1, 3), (3, 2, 2, 3), (1, 4, 1, 3), (1, 4, 2, 4)] 
12 
10 

所以每個組得到一個等級,然後最小分數顯示在底部,有沒有我可以重印得到了分鐘得分後組的方法嗎?因爲如果我嘗試了10萬次,我很難檢查每一個來找出它來自哪個組。

我想:

import random 

def run(my_groups, score): 
    participants = list(range(1,members+1))*n_groups 
    random.shuffle(participants) 

    my_groups = list(zip(*[iter(participants)]*members)) 
    print(my_groups) 

    def get_rating(group): 
     return (len(set(group))) 

    score = ((sum(get_rating(g) for g in my_groups))) 
    print(score) 
    return score 

members = 4 
n_groups = 4 

print(min(run(members, n_groups) for _ in range(10), key=lambda x:x[1])) 

但這種回報「發電機表達必須如果不是唯一的參數括號」,用於運行支架?

+0

所以你想跟蹤哪個組產生最小的分數? –

+0

Yeh so the end:for this case,10 then [(3,3,1,2),(2,1,3,3),(2,4,4,2),(4,1,1 ,4)],它來自的組 – Xenon

回答

1
import random 


def run(members, n_groups): 
    participants = list(range(1, members + 1)) * n_groups 
    random.shuffle(participants) 

    my_groups = list(zip(*[iter(participants)] * members)) 
    return my_groups 


def get_rating(group): 
    return len(set(group)) 


def score(my_groups): 
    return sum(get_rating(g) for g in my_groups) 


best = min(*(run(4, 4) for _ in range(10)), 
      key=score) 
print(best) 
print(score(best)) 
5

更改run返回my_groups, score

然後改變

min(run(members, n_groups) for _ in range(10)) 

min((run(members, n_groups) for _ in range(10)), key=lambda x:x[1]) 

這使得使得min返回整個(my_groups, score)元組,但只比較score(元組的第二元件)來找到最小值。

+0

嗨,謝謝!試過這個,把它放在帖子的編輯中,你可以看到最新的錯誤? – Xenon

+0

對不起,現在應該工作 – yinnonsanders

+0

雖然你得到的錯誤應該告訴你足夠的關於如何解決問題 – yinnonsanders