17

我有一个元组列表,称为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 很陌生,所以我不太了解它是如何工作的。

4

8 回答 8

18

通用格式,您可以遍历列表并访问元组的索引:

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

本例中的 x[0] 将为您提供元组的第一部分,以及 x[1] .... 等等。弄乱并尝试这种格式,您应该能够自己完成其余的工作。

编辑:虽然这里的其他一些答案更好,但从某种意义上说,它们解包元组并更密切地遵循“Python 方式”。像这样:

a, b, c = ('a','b','c')
于 2013-02-28T04:03:38.407 回答
9

或者你可以这样做...

for id, name, semester, grade in gradebook:
    print id, name, semester, grade
于 2013-02-28T04:04:28.937 回答
4
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)

我已手动设置字段宽度以匹配您的示例。但是您可能更喜欢以智能方式生成字段宽度,即基于成绩簿中元素长度的列最大值。

下一次,更好的成绩簿条目数据结构将是 adict而不是tuple.

于 2013-02-28T04:12:21.600 回答
1

您可以定义一个函数命名__str__(self),它在类中返回一个类似于“Class: Math 212.....Subject: Linear Algebra.....Term: Fall 2012.....Grade: B”形式的字符串。然后你可以使用你的代码:

for aTuple in gradebook:
    print(aTuple)

得到预期的输出。

于 2013-02-28T05:41:10.210 回答
0

使用字符串格式

for aTuple in gradebook:
        print('Class: %s.....Subject: %s.....Term: %s.....Grade: %s' % aTuple)
于 2013-02-28T04:04:04.323 回答
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 ........ 学期:2013 年春季............年级:一种

于 2013-02-28T04:18:17.457 回答
0

我对python中一些更高级的格式化选项不太熟悉。话虽如此,这将按要求显示结果。您可以通过索引访问每个元组中的元素。 '.'*(#-len('column info'+g[i]))通过从列宽中减去字符串的长度来给出正确的句点数。要在元素之间不带空格的情况下打印,请使用sep=''inprint()

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 = '')
于 2013-02-28T04:23:05.493 回答
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
于 2013-03-01T23:27:02.363 回答