如何打印元组列表

时间:2013-02-28 03:56:55

标签: python

我有一个名为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很新,所以我真的不明白它是如何工作的。

8 个答案:

答案 0 :(得分:11)

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

for x in gradebook:
    print x[0], x[1]
在这个例子中,

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

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

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

答案 1 :(得分:8)

或者你可以这样做......

for id, name, semester, grade in gradebook:
    print id, name, semester, grade

答案 2 :(得分: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)

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

下次,成绩单条目的更好的数据结构将是dict而不是tuple

答案 3 :(得分:0)

使用string formatting

for aTuple in gradebook:
        print('Class: %s.....Subject: %s.....Term: %s.....Grade: %s' % aTuple)

答案 4 :(得分: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年春季........等级:A

答案 5 :(得分: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 = '')

答案 6 :(得分:0)

你可以定义一个命名__str__(self)的函数,它返回一个字符串,如“Class:Math 212 ......主题:线性代数......术语:2012年秋季.....等级:B“在课堂上。 然后你可以使用你的代码:

for aTuple in gradebook:
    print(aTuple)

获得预期的输出。

答案 7 :(得分: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