2014-02-05 66 views
1

我想要做的名單Python的在線列表遞歸

例如遞歸讀,我有以下幾點:

[x if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]] 

,輸出是:

[2, [9, 8, 7], 4, [9, 8, 7]] 

但我希望它是:

[2, 9, 8, 7, 4, 9, 8, 7] 

可能嗎?

我已經試過

[x if x % 2 == 0 else a for a in [9,8,7] for x in [2,3,4,5]] 

並事先沒有工作[2, 9, 4, 9, 2, 8, 4, 8, 2, 7, 4, 7]

感謝。

+1

'itertools.chain'?目前還不清楚你理解的含義是什麼。一個規則的,更明確的循環可能在這裏更具可讀性。 – geoffspear

+0

請注意,[[a,9,8,7]]中的[a]只是寫作'[9,8,7]'的一種奇特方式。 – RemcoGerlich

+0

@RemcoGerlich ahahahahaa !!有趣,這是我的不好! – jaxkodex

回答

2

或者不itertools:

a = [[x] if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]] 
a = [i for x in a for i in x] 
print (a) 
+0

好的。謝謝!它工作正常,也在一行(正是我需要的) – jaxkodex

1

itertools注意到了這一問題:

from collections import Iterable 
from itertools import chain 

t = [x if x % 2 == 0 else [a for a in [9,8,7]] for x in [2,3,4,5]] 
final_list = list(chain.from_iterable(item if isinstance(item,Iterable) and 
        not isinstance(item, basestring) else [item] for item in t)) 
print(final_list) 

來源:flatten list of list through list comprehension

編輯:與以前的解決方案的問題是它只能使用數組與值相同的水平(前[[1,2], [3,4]])像[5, [1,2], [3,4]]這樣的數組因爲不同級別的值(例如5)而返回一些鏈對象。

+0

這不起作用,引發了一個'TypeError:'int'對象不可迭代 '異常並且後來打印出一個空的數組! – jaxkodex

+0

它是否在這行'print(list(chain))'拋出這個錯誤? –

+0

是的,我只是將它複製到控制檯。 – jaxkodex