2017-05-11 2 views
3

Ich muss eine Funktion schreiben, die eine verschachtelte Liste mit zwei Teams und deren Spielstand sucht. Die Liste enthält mehrere Übereinstimmungen und ich möchte, dass die Ausgabe eine verschachtelte Liste mit allen Teamnamen und wie viele Spiele sie gewonnen haben. Die Liste sieht wie folgt aus:Zählen, wie oft Fußballmannschaften mit einer verschachtelten Liste gewonnen haben

L = [['Patriots', 'Giants', '3', '1'], ['Steelers', 'Patriots', '1', 2'], ['Giants', 'Steelers', '3', '5']] 

So in der obigen Liste die ersten beiden Elemente sind die Teamnamen und die dritten und vierten Elemente sind die Punkte, die sie ein Tor im Spiel. Allerdings ist die Liste viel größer und es gibt viel mehr Teams. Die Ausgabe wird in etwa wie folgt aussehen:

finalList = [['Patriots', 2], ['Giants', 0], ['Steelers', 1]] 

weil die Patriots zwei Spiele gewonnen, Giants gewann Null-Spiele und Steelers gewann ein Spiel.

Ich habe den folgenden Code ausprobiert, aber es funktioniert nicht und ich stecke fest.

def gamesWon(): 
    for i in L: 
     count = 0 
     if i[2]>i[3]: 
      count += 1 
      i.append(count) 
+0

Warum nicht finalList als Wörterbuch mit Namen Team als Schlüssel und punkten als Wert verwenden: 'finalList = { 'Patrioten': 2, 'Riesen' : 0} '? –

+0

Ich habe noch nicht gelernt, Wörterbücher zu benutzen, also würde ich nicht wissen, wie ich das machen soll. –

+0

Remember ** Zen von Python ** von Tim Peters: ** Flat ist besser als verschachtelt.**. Verwenden Sie daher Wörterbücher anstelle von verschachtelten Listen. –

Antwort

2

können Sie defaultdict

from collections import defaultdict 

L = [['Patriots', 'Giants', '3', '1'], ['Steelers', 'Patriots', '1', '2'], ['Giants', 'Steelers', '3', '5']] 

D = defaultdict(int) 

for match in L: 
    team1, team2, score1, score2 = match 
    D[team1] # make sure the team exist in the dict even if it never wins a match 
    D[team2] # make sure the team exist in the dict even if it never wins a match 
    if int(score1) > int(score2): 
     D[team1] += 1 
    if int(score2) > int(score1): 
     D[team2] += 1 

verwenden Sie dann D auf eine Liste leicht umwandeln können, wenn Sie unbedingt brauchen ...

+0

Ich hätte wahrscheinlich sagen sollen, dass ich noch nicht gelernt habe, Wörterbücher zu benutzen, also kann ich sie nicht benutzen. –

3

Sie einen defaultdict verwenden können:

from collections import defaultdict 
# initialize the result as a defaultdict with default value of 0 
result = defaultdict(lambda : 0) 

for t1,t2,s1,s2 in L: 
    if int(s1) > int(s2): 
     result[t1] += 1 
    elif int(s2) > int(s1): 
     result[t2] += 1 

result 
# defaultdict(<function __main__.<lambda>>, {'Patriots': 2, 'Steelers': 1}) 

Beachten Sie, dass obwohl im Ergebnis Teams mit Null-Score fehlt, aber wenn Sie result[team] aufrufen, gibt es Ihnen Null. Alternativ

+0

Dies enthält keine Teams, die niemals gewinnen! – Julien

+0

@Julien Das stimmt. Aber dieses Defaultdict hat 0 als Standardwert, so dass Teams, die niemals gewinnen, immer 0 als Wert haben. – Psidom

+0

Sicher, aber wenn du dann die Struktur an jemanden weitergibst, der nicht alle Teamnamen kennt, sind die Informationen verloren ... und die OP-Liste enthält alle Teams. – Julien

0

, können Sie ein Counter verwenden, die dict artig ist:

import collections as ct 

L = [ 
    ['Patriots', 'Giants', '3', '1'], 
    ['Steelers', 'Patriots', '1', '2'], 
    ['Giants', 'Steelers', '3', '5'], 
    ['Giants', 'Patriots', '1', '1']      # tie 
]  

def count_wins(games): 
    """Return a counter of team wins, given a list of games.""" 
    c = ct.Counter()           
    for team1, team2, s1, s2 in games: 
     c[team1] += 0 
     c[team2] += 0 
     if int(s1) == int(s2): 
      continue 
     elif int(s1) > int(s2): 
      c[team1] += 1 
     else: 
      c[team2] += 1 
    return c 

season = count_wins(L) 
season 
# Counter({'Giants': 0, 'Patriots': 2, 'Steelers': 1}) 

Dieser Code einen Standardwert von Null-Schritten für neue Einträge gibt und Griffe Beziehungen:

L_tie = [['Cowboys', 'Packers', '3', '3']] 
game = count_wins(L_tie) 
game 
# Counter({'Cowboys': 0, 'Packers': 0}) 

Zähler haben einige nützliche Methoden, um die besten Teams zu finden:

season.most_common(2) 
# [('Patriots', 2), ('Steelers', 1)] 

Zähler sind flexibel. Sie können ganz einfach Zähler aktualisieren:

season.update(game) 
season 
# Counter({'Cowboys': 0, 'Giants': 0, 'Packers': 0, 'Patriots': 2, 'Steelers': 1}) 

Sie können auch add (subtract and perform set operations with) andere Zähler:

L_last = [['49ers', 'Raiders', '7', '10'], ['Packers', 'Patriots', '3', '7']] 
last_season = count_wins(L_last) 
season + last_season 
# Counter({'Patriots': 3, 'Raiders': 1, 'Steelers': 1}) 

UPDATE: Siehe auch this related answer für eine Counter/Generator Ausdruck Variante.

0
ll = [['Patriots', 'Giants', '3', '1'], ['Steelers', 'Patriots', '1', '2'], ['Giants', 'Steelers', '3', '5']] 

teamStatus = {} 

for l in ll: 
    team1,team2,team1_score,team2_score = l 
    if team1 not in teamStatus: 
     teamStatus[team1] = 0 
    if team2 not in teamStatus:  
     teamStatus[team2] = 0 

    if int(team1_score) > int(team2_score): 
    teamStatus[team1] += 1 
    else: 
    teamStatus[team2] += 1 

print(teamStatus) 

RESULT

{'Patriots': 2, 'Giants': 0, 'Steelers': 1} 
Verwandte Themen