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

ste*_*anv 43 python list

我知道你能做到

print str(myList)
Run Code Online (Sandbox Code Playgroud)

要得到

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

你可以做到

i = 0
for entry in myList:
  print str(i) + ":", entry
  i += 1
Run Code Online (Sandbox Code Playgroud)

要得到

0: 1  
1: 2  
2: 3    
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Sil*_*ost 100

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

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

  • 更明确地说:丢失方括号使其成为生成器表达式,因此在从中构造字符串之前,它不会在内存中创建整个列表.枚举是一个内置函数,与海报的zip/range/len组合相同. (5认同)

Man*_*zor 12

在python 3s打印功能:

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

输出:

My list:
- 1
- 2
- 3
Run Code Online (Sandbox Code Playgroud)

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

Pro:您没有join()列入字符串对象的列表,这对于较大的列表可能是有利的.整个过程非常简洁易读.


Luc*_*ops 10

l = [1, 2, 3]
print '\n'.join(['%i: %s' % (n, l[n]) for n in xrange(len(l))])
Run Code Online (Sandbox Code Playgroud)

  • 我很震惊有多少人似乎不知道"枚举". (8认同)

Tho*_*hle 6

>>> from itertools import starmap

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

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

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


Joh*_*ooy 6

从此开始:

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

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

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

现在您可以使用map,但是您需要更改格式字符串(糟糕!)

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

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

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