假设我有任何可迭代的
var = "ABCDEF"
我得到像这样的迭代
it = itertools.combinations(var,2)
是否有任何单一功能可以打印所有可迭代的值,如
printall(it)
而不是使用for循环
答案 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())
只是为了好玩。 :)