在Python中,是否有一种优雅的方式以自定义格式打印列表而无需显式循环?

问题描述 投票:38回答:8

我知道你能做到

print str(myList)

要得到

[1, 2, 3]

你可以做到

i = 0
for entry in myList:
  print str(i) + ":", entry
  i += 1

要得到

0: 1  
1: 2  
2: 3    

但有没有类似于第一个得到类似于最后一个结果的方法?

由于我对Python的了解有限(以及文档中的一些帮助),我最好的是:

print '\n'.join([str(n) + ": " + str(entry) for (n, entry) in zip(range(0,len(myList)), myList)])

它不是那么冗长,但至少我在一个(复合)语句中得到一个自定义字符串。你能做得更好吗?

python list
8个回答
99
投票
>>> lst = [1, 2, 3]
>>> print('\n'.join('{}: {}'.format(*k) for k in enumerate(lst)))
0: 1
1: 2
2: 3

注意:您只需要了解列表理解或迭代生成器表达式是显式循环。


11
投票

在python 3s打印功能:

lst = [1, 2, 3]
print('My list:', *lst, sep='\n- ')

输出:

My list:
- 1
- 2
- 3

Con:sep必须是一个字符串,因此您无法根据要打印的元素对其进行修改。你需要一种标题来做到这一点(上面是'My list:')。

Pro:您不必将join()列表添加到字符串对象中,这对于较大的列表可能是有利的。整个过程非常简洁易读。


9
投票
l = [1, 2, 3]
print '\n'.join(['%i: %s' % (n, l[n]) for n in xrange(len(l))])

5
投票

从这开始:

>>> lst = [1, 2, 3]
>>> print('\n'.join('{}: {}'.format(*k) for k in enumerate(lst)))
0: 1
1: 2
2: 3

你可以通过将join作为分隔符传递给\n来摆脱print

>>> print(*('{}: {}'.format(*k) for k in enumerate(lst)), sep="\n")
0: 1
1: 2
2: 3

现在你看到你可以使用map,但你需要更改格式字符串(哎呀!)

>>> print(*(map('{0[0]}: {0[1]}'.format, enumerate(lst))), sep="\n")
0: 1
1: 2
2: 3

或将2个序列传递给map。一个单独的计数器,不再列举lst

>>> from itertools import count
>>> print(*(map('{}: {}'.format, count(), lst)), sep="\n")
0: 1
1: 2
2: 3

4
投票
>>> from itertools import starmap

>>> lst = [1, 2, 3]
>>> print('\n'.join(starmap('{}: {}'.format, enumerate(lst))))
0: 1
1: 2
2: 3

这使用itertools.starmap,就像map,除了它*s函数的参数。在这种情况下的功能是'{}: {}'.format

我更喜欢理解SilentGhost,但是starmap是一个很好的功能。


3
投票

另一个:

>>> lst=[10,11,12]
>>> fmt="%i: %i"
>>> for d in enumerate(lst):
...    print(fmt%d)
... 
0: 10
1: 11
2: 12

另一种形式:

>>> for i,j in enumerate(lst): print "%i: %i"%(i,j)

这个方法很好,因为enumerate生成的元组中的各个元素可以修改,例如:

>>> for i,j in enumerate([3,4,5],1): print "%i^%i: %i "%(i,j,i**j)
... 
1^3: 1 
2^4: 16 
3^5: 243 

当然,不要忘记你可以从中得到一个切片:

>>> for i,j in list(enumerate(lst))[1:2]: print "%i: %i"%(i,j)
... 
1: 11

3
投票
from time import clock
from random import sample

n = 500
myList = sample(xrange(10000),n)
#print myList

A,B,C,D = [],[],[],[]

for i in xrange(100):
    t0 = clock()
    ecr =( '\n'.join('{}: {}'.format(*k) for k in enumerate(myList)) )
    A.append(clock()-t0)

    t0 = clock()
    ecr = '\n'.join(str(n) + ": " + str(entry) for (n, entry) in zip(range(0,len(myList)), myList))
    B.append(clock()-t0)

    t0 = clock()
    ecr = '\n'.join(map(lambda x: '%s: %s' % x, enumerate(myList)))
    C.append(clock()-t0)

    t0 = clock()
    ecr = '\n'.join('%s: %s' % x for x in enumerate(myList))
    D.append(clock()-t0)

print '\n'.join(('t1 = '+str(min(A))+'   '+'{:.1%}.'.format(min(A)/min(D)),
                 't2 = '+str(min(B))+'   '+'{:.1%}.'.format(min(B)/min(D)),
                 't3 = '+str(min(C))+'   '+'{:.1%}.'.format(min(C)/min(D)),
                 't4 = '+str(min(D))+'   '+'{:.1%}.'.format(min(D)/min(D))))

对于n = 500:

150.8%.
142.7%.
110.8%.
100.0%.

对于n = 5000:

153.5%.
176.2%.
109.7%.
100.0%.

哦,我现在看到:只有带map()的解决方案3符合问题的标题。


0
投票

看一下pprint,pprint模块提供了一种“漂亮打印”任意Python数据结构的功能,可以用作解释器的输入。如果格式化结构包含非基本Python类型的对象,则表示可能无法加载。如果包含诸如文件,套接字或类之类的对象,以及许多其他不能表示为Python文字的对象,则可能就是这种情况。

>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(stuff)
[   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']
>>> pp = pprint.PrettyPrinter(width=41, compact=True)
>>> pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
>>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
... ('parrot', ('fresh fruit',))))))))
>>> pp = pprint.PrettyPrinter(depth=6)
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
© www.soinside.com 2019 - 2024. All rights reserved.