如何打印元组列表

18
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个元组列表,名为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非常陌生,所以我不太明白它是如何工作的。

@Hooked 感谢您的编辑...即使是两年后哈哈 :D - yiwei
8个回答

20

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

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

在这个例子中,x[0]将给出元组的第一部分,x[1]以此类推。尝试调整和实验该格式,你应该能够自己完成其余部分。

编辑:虽然其他答案更好,因为它们打开了元组,并更加符合"Python之道"。就像这样:

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

谢谢!这个方法很有效而且简洁。+1。另外一个问题,你知道怎么样在给定类名的情况下从列表中删除一个元组吗? - yiwei
1
@Yiwei Gao,如果你想从一个列表中特定删除一个元组,可以使用以下代码:del x[0]。其中,x是你的列表名称,0代表该元组在列表中的位置。 - eazar001
1
另外,如果您想使用for循环删除它,只需在循环中使用适当的if语句访问当前元组并说:del x - eazar001

10

或者你可以这样做...

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

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)

我已经手动设置了字段宽度以匹配您的示例。但是您可能更喜欢以智能方式生成字段宽度,即基于成绩单中元素长度的列最大值。
下次,您的成绩单条目的更好数据结构应该是一个字典而不是一个元组。

1

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

for aTuple in gradebook:
    print(aTuple)

获得期望的输出。


改变内置函数的默认行为并不是一个好主意。 - hostingutilities.com

1
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

0

使用字符串格式化

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

0

你可以通过为元素分配名称来进行索引(如果你正在计算某些内容,这可能很方便):

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

课程:数学212...科目:线性代数...学期:2012年秋季...成绩:B

课程:计算机科学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


0

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

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 = '')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接