24

假设我有一个可迭代的:

var = "ABCDEF"

我得到这样的迭代:

it = itertools.combinations(var,2)

是否有任何单个函数可以打印可迭代的所有值,例如

printall(it)

而不是使用for循环?

4

5 回答 5

36

这取决于你想要什么,如果你想打印出所有的值,你需要计算它们 - 一个可迭代的不保证在它们都被请求之前计算这些值,所以实现这一点的最简单方法是清单

print(list(iterable))

这将以正常列表格式打印出项目,这可能是合适的。如果您希望每个项目都在新行上,最好的选择是,正如您所提到的,一个简单的 for 循环:

for item in iterable:
    print(item)

如果您不需要特定格式的数据,而只需要可读性(例如,并非全部在一行上),您可能需要查看pprint模块

最后一个选项,我真的不觉得是最佳的,但为了完整性而提及,在 3.x 中是可能的,其中函数print()非常灵活:

print(*iterable, sep="\n")

在这里,我们将可迭代对象解包为参数print(),然后将分隔符设为换行符(与通常的空格相反)。

于 2013-02-22T01:38:40.727 回答
5

您可以使用该str.join方法并将可迭代的每个元素加入新行。

print('\n'.join(it))
于 2013-02-22T01:40:41.137 回答
1

您可以使用 format 允许每个元素按照您的意愿进行格式化:

>>> print '\n'.join('{:>10}'.format(e) for e in iter([1,2,'1','2',{1:'1'}]))
         1
         2
         1
         2
  {1: '1'}

每个元素不一定是字符串,但__repr__如果不是字符串则必须有方法。

然后,您可以轻松编写所需的功能:

>>> def printall(it,w): print '\n'.join('{:>{w}}'.format(e,w=w) for e in it)
>>> printall([1,2,'3','4',{5:'6'}],10)
         1
         2
         3
         4
  {5: '6'}

我正在使用一个列表,但任何可迭代的都可以。

于 2013-02-22T02:11:05.517 回答
1

您可以使用itertools 中的chain()函数为 var 数据创建迭代器,然后使用迭代器的 * 运算符解包

>>> from itertools import chain
>>> var = 'ABCDEF'
>>> print(*chain(var))
A B C D E F
>>> print(*chain(var), sep='\n')
A
B
C
D
E
F

如果您只需要遍历现有数据并再次打印出来,您可以使用星号运算符 *

>>> print(*var)
A B C D E F
>>> print(*var, sep='\n')
A
B
C
D
E
F
于 2018-01-14T11:29:54.693 回答
0

如果您坚持一个解决方案,它在没有循环的情况下进行迭代for适用于无限迭代器:

from more_itertools import consume

def printall(it):
    consume(map(print, it))

而不是for我们consume这里的循环。
请注意,在这种情况下,迭代器在打印时被消耗。

当然,这也适用于无限迭代器:

from itertools import count

printall(count())

只是为了好玩。:)

于 2021-07-04T23:16:19.797 回答