2009-11-30 150 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