2013-02-28 53 views
8

我有一個元組列表,名爲gradebook,其中每個列表元素是一個元組,對應一個班級和一個學生可以獲得的成績。例如,如何打印元組列表

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

依此類推。我想它來打印這樣的:

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

我希望能夠去通過列表中的每個元組,然後打印出來的元組的每個元素。我怎樣才能做到這一點?

編輯:這是我現在所擁有的:

for aTuple in gradebook: 
    print(aTuple) 

對不起,我很新的Python的,所以我真的不明白這是如何工作。

+0

爲編輯@Hooked感謝...甚至兩年後哈哈:d – yiwei 2015-03-22 19:07:22

回答

7

常規格式,則可以通過一個列表遍歷並訪問元組的索引:

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

X [0]在此示例中會給你元組的第一部分,和X [1] ....等等。 圍繞這個格式進行實驗,你應該可以自己完成剩下的工作。

編輯:雖然其他答案在這裏更好,在他們解壓元組和更緊密地遵循「Python的方式」的意義上。喜歡這樣:

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

感謝!這工作和簡潔。 +1。邊問題,任何想法如何從列表中刪除給定某個類名稱的元組? – yiwei 2013-03-02 21:14:52

+1

@Yiwei Gao,如果你想特別從列表中刪除一個元組,例如:'del x [0]'例如,其中'x'是你的列表的名字,'0'表示你的元組的位置列表。 – eazar001 2013-03-02 23:31:52

+1

另外,如果你想使用for循環刪除它,你可以在循環中使用適當的if語句在循環中訪問當前元組:'del x'。 – eazar001 2013-03-03 00:45:20

6

或者你可以做到這一點...

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) 

我已經手動設置字段寬度以匹配您的例子。但您可能更喜歡以智能方式生成字段寬度,即基於成績冊中元素長度的列最大值。

下一次,您的成績簿條目的更好的數據結構將是dict而不是tuple

0

可以通過設置元素的名稱索引(有時,如果你的東西計算方便):

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

類:數學212 ...主題:線性代數...期限:2012年秋季...等級:

B類:CS 130 ...主題:Python的...期限:2013年春季...等級:A

更均勻間距:

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 

類:數學212 ............學科:線性代數......術語:2012年秋季...........等級:B

類:CS 130 ..............主題:Python ..............術語:Spring 2013 .........等級:A

0

我不太熟悉python中一些更高級的格式選項。這就是說,這將顯示結果的要求。您可以通過索引訪問每個元組中的元素。 '.'*(#-len('column info'+g[i]))通過從列寬中減去字符串的長度來提供正確的句號數。要打印此無元件之間的空間使用sep=''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

你可以定義一個函數命名__str__(self),它返回一個字符串等形式「類:數學212 .....主題:線性代數。 ....期限:2012年秋季.....等級:B「。 那麼你可以使用你的代碼:

for aTuple in gradebook: 
    print(aTuple) 

得到預期的輸出。

+0

改變內置函數的默認行爲不是一個好主意。 – 2016-02-28 00:15:05

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

結果

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