如何更好地打印列表?

36 投票
25 回答
71032 浏览
提问于 2025-04-15 14:50

这跟如何在Python中“好看”地打印列表这个问题有点像,不过我想把列表打印得更好看一些——不想要方括号、单引号和逗号,最好能以列的形式显示。

foolist = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf', 
    'pdcurses-devel',     'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
    'qgis1.1', 'php_mapscript']

evenNicerPrint(foolist)

想要的结果:

exiv2-devel       msvcrt        
mingw-libs        gdal-grass    
tcltk-demos       iconv         
fcgi              qgis-devel    
netcdf            qgis1.1       
pdcurses-devel    php_mapscript 

谢谢!

25 个回答

12

简单:

l = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf', 
    'pdcurses-devel',     'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
    'qgis1.1', 'php_mapscript']

if len(l) % 2 != 0:
    l.append(" ")

split = len(l)/2
l1 = l[0:split]
l2 = l[split:]
for key, value in zip(l1,l2):
    print '%-20s %s' % (key, value)         #python <2.6
    print "{0:<20s} {1}".format(key, value) #python 2.6+
34

这个回答使用了@Aaron Digulla的回答中的相同方法,只是语法上更符合Python的风格。这可能会让上面的某些回答更容易理解。

>>> for a,b,c in zip(foolist[::3],foolist[1::3],foolist[2::3]):
>>>     print '{:<30}{:<30}{:<}'.format(a,b,c)

exiv2-devel                   mingw-libs                    tcltk-demos
fcgi                          netcdf                        pdcurses-devel
msvcrt                        gdal-grass                    iconv
qgis-devel                    qgis1.1                       php_mapscript

这个方法可以很容易地适应任意数量的列或者可变的列,这样就能得到类似@gnibbler的回答。间距可以根据屏幕宽度进行调整。


更新:根据要求进行解释。

索引

foolist[::3]会选择foolist中的每第三个元素。foolist[1::3]则是从第二个元素开始选择每第三个元素('1'是因为Python是从零开始计数的)。

In [2]: bar = [1,2,3,4,5,6,7,8,9]
In [3]: bar[::3]
Out[3]: [1, 4, 7]

zip

把列表(或其他可迭代对象)进行“压缩”会生成这些列表元素的元组。例如:

In [5]: zip([1,2,3],['a','b','c'],['x','y','z'])
Out[5]: [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]

结合

把这些想法结合起来,我们得到了我们的解决方案:

for a,b,c in zip(foolist[::3],foolist[1::3],foolist[2::3]):

这里我们首先生成了三个foolist的“切片”,每个切片都是每第三个元素,并且偏移一个位置。单独来看,它们各自只包含列表的三分之一。现在,当我们把这些切片压缩在一起并进行迭代时,每次迭代都会给我们foolist中的三个元素。

这正是我们想要的:

In [11]: for a,b,c in zip(foolist[::3],foolist[1::3],foolist[2::3]):
   ....:      print a,b,c                           
Out[11]: exiv2-devel mingw-libs tcltk-demos
         fcgi netcdf pdcurses-devel
        [etc]

而不是:

In [12]: for a in foolist: 
   ....:     print a
Out[12]: exiv2-devel
         mingw-libs
         [etc]
29

虽然这个标准库模块在Python 3中并不是专门为此设计的,但它提供了一个功能,可以将一串字符串以多列的形式打印出来。

import cmd
cli = cmd.Cmd()
cli.columnize(foolist, displaywidth=40)

输出结果:

exiv2-devel     msvcrt       
mingw-libs      gdal-grass   
tcltk-demos     iconv        
fcgi            qgis-devel   
netcdf          qgis1.1      
pdcurses-devel  php_mapscript

你甚至可以选择输出的位置,比如用 cmd.Cmd(stdout=my_stream) 来指定。

撰写回答