是否有任何单个函数来打印iterables值

时间:2013-02-22 01:36:15

标签: python

假设我有任何可迭代的

var = "ABCDEF"

我得到像这样的迭代

it = itertools.combinations(var,2)

是否有任何单一功能可以打印所有可迭代的值,如

printall(it)

而不是使用for循环

5 个答案:

答案 0 :(得分:17)

这取决于你想要什么,如果你想要打印出所有的值,你需要计算它们 - 一个iterable不保证值被计算直到它们全部被请求之后,所以最简单的方法来实现这个是make a list

print(list(iterable))

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

for item in iterable:
    print(item)

如果您不需要特定格式的数据,但只需要它可读(例如,不是所有数据都在线上),您可能需要查看the pprint module

最后一个选项,我觉得不是最优的,但提到完整性,可以在3.x中,其中the print() function非常灵活:

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

这里我们unpack the iterable作为print()的参数,然后使分隔符成为换行符(而不是通常的空格)。

答案 1 :(得分:4)

您可以使用str.join方法并在新行上连接iterable的每个元素。

print('\n'.join(it))

答案 2 :(得分:1)

您可以使用格式,以便根据需要格式化每个元素:

>>> 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'}

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

答案 3 :(得分:0)

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

>>> 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

答案 4 :(得分:0)

如果您坚持一种无需 for 循环的迭代解决方案并且适用于无限迭代器:

from more_itertools import consume

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

这里有 for 代替 consume 循环。
请注意,在这种情况下,迭代器在打印时被消耗。

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

from itertools import count

printall(count())

只是为了好玩。 :)