2009-11-30 151 views
2

考虑一下:的Python:嵌套循环

>>> a = [("one","two"), ("bad","good")] 

>>> for i in a: 
...  for x in i: 
...   print x 
... 
one 
two 
bad 
good 

我怎么能写这样的代码,但使用的语法,如:

for i in a: 
    print [x for x in i] 

很显然,这是不行的,它打印:

['one', 'two'] 
['bad', 'good'] 

我想要相同的输出。可以做到吗?

+1

我不太清楚你想要做什么。你的第二个例子有一个通过列表生成器的隐式循环。您的问题仅仅是出于美学原因,您不希望出现两个“for”循环? – 2009-11-30 18:23:53

+5

就我个人而言,我认为你已经拥有的循环是做到这一点的最佳方式。它简单,清晰和可读。 – 2009-11-30 18:42:07

回答

4
>>> a = [("one","two"), ("bad","good")] 
>>> print "\n".join(j for i in a for j in i) 
one 
two 
bad 
good 



>>> for i in a: 
... print "\n".join(i) 
... 
one 
two 
bad 
good 
3
import itertools 
for item in itertools.chain(("one","two"), ("bad","good")): 
    print item 

将产生期望的输出,只有一个for循环。

+0

这有效,但我猜(尽管不是肯定的),在他的真实代码中他有** n **元组数,而不是预定义的集合,他可以硬编码。 – 2009-11-30 18:33:01

+0

要了解我所得到的结果,请阅读tgray的回答,并附带* *符号。 – 2009-11-30 18:40:19

0

不是最好的,但是:

for i in a: 
    some_function([x for x in i]) 

def some_function(args): 
    for o in args: 
     print o 
7

列表内涵和发电机仅设计用作表达式,而印刷是一种说法。虽然你可以实现你试图做

from __future__ import print_function 
for x in a: 
    [print(each) for each in x] 

这样做是惊人的unpythonic和结果以列表的产生,你实际上并不需要。你可以做的最好的事情就是在原始例子中编写嵌套的for循环。

+0

还应该注意的是,这将只适用于Python 2.6或3 – 2009-11-30 18:40:50

+0

好得多使用** tgray **提供的答案,而不是这个 – 2009-11-30 18:44:58

+0

打印功能真的很棒,但我认为有一个更好的方法使用它(因此我的答案)。 – u0b34a0f6ae 2009-11-30 18:49:48

1

你需要定义自己的打印方法(或进口__future__.print_function

def pp(x): print x 

for i in a: 
    _ = [pp(x) for x in i] 

注意_用于指示返回的列表将被忽略。

7

鉴于你例如,你可以做这样的事情:

a = [("one","two"), ("bad","good")] 

for x in sum(map(list, a), []): 
    print x 

这可以,但是,变得非常缓慢,一旦名单会越来越大。

更好的方式来做到这一点会像Tim Pietzcker建议:

from itertools import chain 

for x in chain(*a): 
    print x 

使用star notation*a,可以让你有n个元组在列表中。

+0

+1,星号表示法就是这样的方式。 – 2009-11-30 18:39:23

3

打印功能真的是优越的,但这里是一个更Python化的建议,由本杰明·波拉克的回答启发:

from __future__ import print_function 
for x in a: 
    print(*x, sep="\n") 

只需使用*到列表x作为参数解压的功能,并使用换行分隔符。

1

这个代码比这里其他的解决方案直接和简单的:

for i in a: 
    print '\n'.join([x for x in i]) 
+0

'print'\ n'.join(j for k in a for j in k)' – stephan 2009-11-30 18:56:51