2014-12-27 27 views
5

Sto utilizzando il codice seguente per produrre 2 elenchi, elenco nomi e lista voti.Stampa di 2 elenchi uniformemente popolati fianco a fianco in modo uniforme

nameList[]   
gradeList[] 
for row in soup.find_all('tr'): 
     name = row.select('th strong') 
     grade = row.select('td label') 
     if grade and name: 
      if "/" in grade[0].text: 
       gradeList.append(grade[0].text) 
       nameShort = re.sub(r'^(.{20}).*$', '\g<1>...', str(name[0].text)) 
       nameList.append(nameShort) 

Produrre qualcosa di simile:

nameList = [“grade 1”,”grade 2222222222”,”grade 3”] 
gradeList = [“1/1”,”2/2”,”100000/100000”] 

voglio il programma per stampare gli elenchi in 2 colonne di pulizia, fianco a fianco. All'interno di ogni colonna, voglio che i dati siano allineati a sinistra. Le liste (senza esito negativo) saranno sempre popolate uniformemente. La prima colonna (nameList) non sarà mai più lunga di 25 caratteri. Quello che sto cercando potrebbe essere simile al seguente:

 Assignment   Grade 
0  grade 1    1/1 
1  grade 2222222222 2/2 
2  grade 3    100000/100000 

ho provato ad usare i panda e ha funzionato, ma la formattazione era strano e fuori luogo. Non si allinea alla sinistra come voglio. Credo che ciò sia accaduto perché i dati hanno ciascuno una lunghezza di carattere diversa in entrambi gli elenchi (mostrati sopra).

risposta

7

Utilizzando str.format:

nameList = ["grade 1", "grade 2222222222", "grade 3"] 
gradeList = ["1/1", "2/2", "100000/100000"] 

fmt = '{:<8}{:<20}{}' 

print(fmt.format('', 'Assignment', 'Grade')) 
for i, (name, grade) in enumerate(zip(nameList, gradeList)): 
    print(fmt.format(i, name, grade)) 

uscita:

 Assignment   Grade 
0  grade 1    1/1 
1  grade 2222222222 2/2 
2  grade 3    100000/100000 

In alternativa, è anche possibile utilizzare printf style formatting using % operator:

fmt = '%-8s%-20s%s' 

print(fmt % ('', 'Assignment', 'Grade')) 
for i, (name, grade) in enumerate(zip(nameList, gradeList)): 
    print(fmt % (i, name, grade)) 
+0

Che cos'è la definizione "fmt = '{: <8} {: <20} {}'"? Quando eseguo questo codice, il programma stampa l'elenco come 20 volte. –

+0

@JacksonBlankenship, È una stringa di formato che indica a 'str.format' come formattare gli argomenti:' {: <8} 'è shrotcut per' {0: <8} '. '0' significa 0 ° (primo argomento),': 'inizia la specifica del formato,' <': allineamento a sinistra,' 8' significa larghezza. – falsetru

+0

@JacksonBlankenship, Se vuoi saperne di più sulla sintassi della stringa Format, segui il link nella risposta o questa: [Format String Syntax] (https://docs.python.org/3/library/string.html#formatstrings) – falsetru

3

Date due liste

nameList = ['grade 1','grade 2222222222','grade 3'] 
gradeList = ['1/1','2/2','100000/100000'] 

formato separato da tabulazione. usando zip() due itera su entrambi gli elenchi allo stesso tempo

print 'Assignment \t\tGrade' 
for n,g in zip(nameList,gradeList): 
    print n + '\t\t\t' + g 


Assignment   Grade 
grade 1   1/1 
grade 2222222222 2/2 
grade 3   100000/100000