如何更好地打印列表?
这跟如何在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)
来指定。