2013-02-28 12 views
8

Ho un elenco di tuple, chiamato gradebook, in cui ogni elemento dell'elenco è una tupla che corrisponde a una classe e un voto che uno studente può guadagnare. Ad esempio,Come stampare un elenco di tuple

gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), 
      ('CS 130', 'Python', 'Spring 2013', 'A')] 

E così via. Mi piacerebbe che la stampa in questo modo:

Class: Math 212.....Subject: Linear Algebra.....Term: Fall 2012.....Grade: B` 
Class: CS 130.......Subject: Computer Science...Term: Spring 2013...Grade: A` 

mi piacerebbe essere in grado di passare attraverso ogni tupla nella lista, e poi stampare ogni elemento della tupla. Come posso raggiungere questo obiettivo?

EDIT: Questo è ciò che ho in questo momento:

for aTuple in gradebook: 
    print(aTuple) 

Mi dispiace, sono molto nuovo a Python, quindi non capisco come funziona.

+0

grazie @Hooked per la modifica ... anche due anni più tardi haha: D – yiwei

risposta

7

formato Generale, è possibile scorrere un elenco e accedere all'indice di una tupla:

for x in gradebook: 
    print x[0], x[1] 

x [0] in questo esempio vi darà la prima parte della tupla, e x [1] .... presto. Divertiti con questo formato e dovresti essere in grado di fare il resto da solo.

MODIFICA: Anche se alcune delle altre risposte sono più belle qui, nel senso che scompattano le tuple e seguono più da vicino la "via di Python". Come ad esempio:

a, b, c = ('a','b','c') 
+0

grazie! questo ha funzionato ed è stato conciso. +1. domanda a parte, qualche idea su come eliminare una tupla dalla lista dato un determinato nome di classe? – yiwei

+1

@Yiwei Gao, Se vuoi eliminare una tupla in particolare da una lista, fai: 'del x [0]' per esempio dove 'x' è il nome della tua lista, e' 0' rappresenta la posizione della tua tupla in la lista. – eazar001

+1

Inoltre, se vuoi cancellarlo usando il tuo 'for loop', diresti semplicemente:' del x' per la tupla corrente a cui accedi nel ciclo, usando l'istruzione 'if' appropriata, nel tuo loop. – eazar001

6

Oppure si potrebbe fare questo ...

for id, name, semester, grade in gradebook: 
    print id, name, semester, grade 
3
gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), ('CS 130', 'Python', 'Spring 2013', 'A')] 

fieldwidths = 13, 19, 14, 1 
for tup in gradebook: 
    tup = (s.ljust(w, '.') for s,w in zip(tup, fieldwidths)) 
    print 'Class: {}Subject: {}Term: {}Grade: {}'.format(*tup) 

ho impostare manualmente la larghezza del campo per abbinare il vostro esempio. Ma potresti preferire generare larghezze di campo in modo intelligente, ad esempio in base ai massimi delle colonne delle lunghezze degli elementi nel registro dei voti.

La prossima volta, una migliore struttura dati per le voci del tuo registro sarebbe un dict anziché tuple.

0

È possibile indice assegnando elementi nomi (a volte conveniente se si sta calcolando qualcosa):

for (a, b, c, d) in gradebook: 
    print "Class: ", a, "...Subject: ", b, "...Term: ", c, "...Grade: ", d 

Classe: Math 212 ... Oggetto: Algebra lineare ... Termine: Autunno 2012 ... grado: B

Classe: CS 130 ... Oggetto: Python ... Termine: primavera del 2013 ... grado: A

Per maggiori anche la spaziatura:

for (a, b, c, d) in gradebook: 
    print "Class: ", a, "."*(20-len(a)), "Subject: ", b, "."*(20-len(b)), "Term: ", c, "."*(20-len(c)), "Grade: ", d 

Classe: Math 212 ............ Oggetto: Algebra lineare ...... Termine: Autunno 2012 ........... Grado: B

Classe: CS 130 .............. Oggetto: Python .............. Termine: Primavera 2013 .........Grado: A

0

Non ho molta familiarità con alcune delle opzioni di formattazione più avanzate in python. Detto questo, questo mostrerà i risultati come richiesto. Puoi accedere agli elementi di ciascuna tupla dal loro indice. '.'*(#-len('column info'+g[i])) indica il numero corretto di periodi sottraendo la lunghezza della stringa dalla larghezza della colonna. Per stampare questo senza spazi tra gli elementi si utilizza il sep='' in print()

gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), ('CS 130', 'Python', 'Spring 2013', 'A')] 
for g in gradebook: 
    print('Class: ', g[0], '.'*(20-len('Class: '+g[0])), 
    'Subject: ', g[1], '.'*(28-len('Subject: '+g[1])), 
    'Term: ', g[2], '.'*(20-len('Term: '+g[2])), 
    'Grade: ', g[3], sep = '') 
0

si può definire una funzione di denominazione __str__(self), che restituiscono una stringa come la forma "Classe: Math 212 ..... Oggetto: Algebra lineare. .... Termine: Autunno 2012 ..... Voto: B "nella classe. quindi è possibile utilizzare il codice:

for aTuple in gradebook: 
    print(aTuple) 

per ottenere i risultati attesi.

+0

Non è una buona idea modificare il comportamento predefinito delle funzioni integrate. –

0
gradebook = [('Math 212', 'Linear Algebra', 'Fall 2012', 'B'), 
      ('CS 130', 'Python', 'Spring 2013', 'A'), 
      ('Economics History','1914','Fall 14','D')] 

fields = '...'.join('{:.<%ds}' % max(map(len,cat)) 
        for cat in zip(*gradebook)) 

print 'fields :\n%r\n\n' % fields 

def disp(x,fields=fields): 
    if all(isinstance(el,tuple) for el in x): 
     # x is a collections of tuples 
     print '\n'.join(fields.format(*el) for el in x) 
    elif all(isinstance(el,str) for el in x): 
     # x is a collection of strings 
     print fields.format(*x) 

print 'disp(gradebook) :\n\n', 
disp(gradebook) 
print '\n' 
print 'disp(gradebook[1]) :\n\n', 
disp(gradebook[1]) 

risultato

fields : 
'{:.<17s}...{:.<14s}...{:.<11s}...{:.<1s}' 


disp(gradebook) : 

Math 212............Linear Algebra...Fall 2012.....B 
CS 130..............Python...........Spring 2013...A 
Economics History...1914.............Fall 14.......D 


disp(gradebook[1]) : 

CS 130..............Python...........Spring 2013...A 
Problemi correlati