2016-07-14 150 views
2

我在通过for循环迭代之后努力对齐一些数据。我想每个for循环输出一个单独的列,但未能弄清楚如何完成这一点。我试过用end =''结尾来换行,但并没有把下一列带回顶端。你能帮忙吗?下面是我试图构建的代码的可测试示例。非常感谢您的帮助。Python并列打印列

import time, re, collections, operator 

output_list = [['2016-07-12', 'Magazine', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-12', 'Book', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-13', 'Book', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABREF', 'Zoo'], 
['2016-07-14', 'Article', 'News Paper #4', 'Radio', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-15', 'Article', 'News Paper #4', 'Radio', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-15', 'Snippet', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo']] 


def count_types(): 
    #item_1 = mm_counts(0) 
    item_2 = mm_counts(1) 
    item_3 = mm_counts(2) 
    item_4 = mm_counts(3) 
    item_5 = mm_counts(4) 
    item_6 = mm_counts(5) 
    item_7 = mm_counts(6) 
    item_8 = mm_counts(7) 

print('=' * 90) 
print(('Media1 Media2 Media3 Media4 Media5 Media6 Media7')) 
print('=' * 90) 
def mm_counts(a): 
    r = [] 
    for i in output_list: 
     x = (i[a]) 
     r.append(x) 
    y = collections.Counter(r) 

    padding = 9 
    for k, v in sorted(y.items(), key=operator.itemgetter(1), reverse=True): 
     z = (str(k).ljust(13, ' ') + ' ' + (str(v).ljust(5, ' '))) 
     print (z) 

count_types() 

电流输出:

========================================================================================== 
Media1 Media2 Media3 Media4 Media5 Media6 Media7 
========================================================================================== 
Article  2  
Book   2  
Snippet  1  
Magazine  1  
News Paper #2 4  
News Paper #4 2  
Podcast  4  
Radio   2  
1234567  6  
10-10-10-10 6  
ABCDEFG  5  
ABREF   1  
Zoo   6  

所需的输出:

============================================================================================= 
Media1  Media2   Media3  Media4  Media5   Media6  Media7 
============================================================================================== 
Article 2 Magazine  1 Podcast 4 1234567 6 10-10-10-10 6 ABCDEFG 5 Zoo 6 
Book  2 News Paper #2 4 Radio 2    ABREF 1 
Snippet 1 News Paper #4 2  
Magazine 1 
+1

灿在打印之前,是否将所有数据最初存储在'lists'中,然后将它们压缩(或一起迭代)? –

+0

只要'从__future__导入print_function'并连续执行'print(“...”,end =“”)'不应该破坏行。 [如何在没有换行符或空格的Python中打印?](http://stackoverflow.com/questions/493386/how-to-print-in-python-without-newline-or-space) – mhoff

+1

@MichaelHoff,我试过了但它只是打印一行中的所有行而不是列。如果它已经为你工作,你可以请发布修改后的代码? – MBasith

回答

0

学习使用(的格式字符串).format方法。您可以指定字段长度,左/中/右对齐,小数位和/或数字值的前导零等等。 https://docs.python.org/3/library/string.html#formatspec

一个例子

>>> kvp = [('Newspaper', 47), ('TV', 192), ('Radio', 543)] 
>>> fs = '{0[0]:>10s} {0[1]:6d}' 
>>> ' '.join([ fs.format(kv) for kv in kvp ]) 
' Newspaper  47   TV 192   Radio 543 ' 

颇有几分对那里发生的。 fs是一个格式字符串。 {...}以格式字符串标记要格式化的项目。在大括号内,:之前的内容标识了格式化后的内容以及如何格式化它。 0[0]0[1].format方法(必须是可下标的)的第一个(仅此处)参数的第一个和第二个元素。 >10s意味着右对齐以10 6d的场宽度的字符串意味着在6

最后' '.join([ fs.format(kv) for kv in kvp ])场宽度十进制整数创建kvp(即字符串)的格式的元素的列表,并连接它们的所有四个它们之间有空格(但没有四个前导或尾随空格)。

(是的,这是部分答案。有人可以回答把正确的实体以正确的顺序格式化成输出所需的线,如果我误解了“对齐”的问题)

+0

感谢您的回复。我也尝试过,如果值只有一个项目,它会使文本进入对齐状态。但是,我通过多个值进行迭代,因此当每列有多个值时,它不会工作。 – MBasith

+0

这不是我用'.join'向你展示的吗? 'kvp'是元组列表,列表的长度是任意的。每个元组通过'.format'变成一个(这里是固定长度的)字符串,然后这些格式化的字符串连接在一起形成一行输出。如果问题是如何将您的输入数据重新排序为例如'kvp',我完全没有发现这个问题。再次强调不要格式化? – nigel222

+0

好的,对不起,我对Python非常陌生。这是我添加的内容,但并未完成将它们添加到列中。你能让我知道我做错了什么。对于已排序(y.items(),key = operator.itemgetter(1),reverse = True)中的kv,'fs ='{0 [0]:> 10s} {0 [1]:6d}' print (''.join([fs.format(kv)]))' – MBasith