2017-08-30 2 views
0

Dies ist mein Code, der Gruppen aus einer Reihe von Mitgliedern erstellt, dann jede Gruppe bewertet und dann summiert, um in diesem Fall eine Gesamtpunktzahl für die 4 Gruppen zu erhalten.Returning min Punktzahl

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))) 

Ausgang:

[(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 

So jede Gruppe eine Bewertung erhält dann die min Punktzahl am Ende angezeigt wird, gibt es eine Möglichkeit, dass ich die Gruppe erneut drucken kann, die, dass nach min Punktzahl bekam? Wenn ich es mit 100.000 versuche, ist es sehr schwer für mich, jeden zu überprüfen, um herauszufinden, aus welcher Gruppe er stammt!

Ich habe versucht:

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])) 

Aber diese Rückkehr für die Halterung von run „Generator Ausdruck, wenn nicht einziges Argument klammerten werden muss“?

+0

Sie wollen also verfolgen, welche Gruppe die kleinste Punktzahl produziert? –

+0

Yeh so am Ende: für diesen Fall, 10 dann [(3, 3, 1, 2), (2, 1, 3, 3), (2, 4, 4, 2), (4, 1, 1 , 4)], die Gruppe kam es von – Xenon

Antwort

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

Ändern Sie run, um my_groups, score zurückzugeben.

Dann

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

zu

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

Dies macht es so, dass min den gesamten (my_groups, score) Tupel zurück, aber nur vergleicht score (das zweite Element des Tupels) den Minimalwert zu finden .

+0

Hallo danke! Versucht dies, legte es in die Bearbeitung der Post können Sie sehen, was schief geht? – Xenon

+0

Entschuldigung, sollte jetzt funktionieren – yinnonsanders

+0

Obwohl der Fehler, den Sie haben, sollte Ihnen genug darüber sagen, wie das Problem zu beheben – yinnonsanders