2009-11-19 103 views
0

比方說,我有一個地方叫majorPowers包含這兩個列表名單:添加列表元素的「大名單」

axis=["germany","italy","japan"] 
allies=["russia","uk","us"] 

我想插入每個列表的元素,進入一個新的百萬列表。目前,我正在這樣做:

>>> temp = [] 
>>> temp = [ww2.append(t) for t in majorPowers] 
>>>ww2 
[['germany','italy','japan'],['russia','uk','us']] 

如何調整這種不使用temp和個人元素插入ww2代替清單自身(axisallied)。

此外,將新的巨型列表本身歸類爲一個綜合列表,或製作它的過程?

編輯:

請注意,我不想做的事:

for a in list1: 
    for b in a: 
     c.append(b) 

@美國洛特。我明白你的觀點。然而,我試圖學習Python中的一些技巧,而不是我通常會做的事情的標準方式。這只是爲了讓我更加了解Python!

+0

有什麼不對你的「我不想做」的解決方案? (1)它的工作。 (2)短而清楚。它出什麼問題了? – 2009-11-19 11:08:59

+2

python list.extend'for for b in a:c.append'(b)' – 2009-11-19 11:11:26

+1

我只是想指出,你使用append的列表理解可能已經寫成ww2 = [axis,allies]來產生結果。下面有一些很好的解決方案,但他們沒有提到列表展平,這就是你正在做的。如果你谷歌的「Python列表扁平化」,那麼你應該談論一些有趣的討論。 – 2009-11-19 11:40:32

回答

5

,你問這個問題,因爲它是不好的形式濫用列表 內涵一樣,這是件好事。您顯示的代碼使用append,而不是生成temp的 元素,但是由於其副作用。 避免列表中的副作用 理解

所以,你可以做幾件事情。首先,你可以使用 itertools.chain

>>> from itertools import chain 
>>> list(chain(*mayorPowers)) 
['germany', 'italy', 'japan', 'russia', 'uk', 'us'] 

不是傳遞的mayorPowers個別參數的元素chain的,你也可以使用itertools.chain.from_iterable

>>> list(chain.from_iterable(mayorPowers)) 
['germany', 'italy', 'japan', 'russia', 'uk', 'us'] 

或者你可以使用extend

>>> ww2 = [] 
>>> for mp in mayorPowers: 
...  ww2.extend(mp) 
... 
>>> ww2 
['germany', 'italy', 'japan', 'russia', 'uk', 'us'] 

或者sum(我喜歡這一張最,我想):

>>> sum(mayorPowers, []) 
['germany', 'italy', 'japan', 'russia', 'uk', 'us'] 

或者說,是有點瘋狂(使用functools.reduceoperator.add),

>>> from functools import reduce 
>>> from operator import add 
>>> reduce(add, mayorPowers) 
['germany', 'italy', 'japan', 'russia', 'uk', 'us'] 
+0

我不要認爲你需要導入減少 - 我認爲'reduce'和'map'是內置的(至少從2.5) – robince 2009-11-19 11:10:36

+0

@thrope:2.x是的,但不是在3.x. (「減少」經常被濫用,正如你所看到的,在這個例子中,它也不是首選的方法。) – Stephan202 2009-11-19 11:12:26

+0

你總是提供一個詳盡的,寫得很好的答案,Stephan202。非常感激! :) – Federer 2009-11-19 11:18:28

1
from itertools import chain 
ww2 = list(chain.from_iterable(majorPower)) 
+0

-1:itertools的不必要的使用 – 2009-11-19 10:58:39

+0

或者,由於市長權力數量有限,所以'list(chain(* mayorPowers))'。 – Stephan202 2009-11-19 10:58:45

+0

sum(majorPowers,[])有什麼問題呢? – 2009-11-19 11:01:27

0

儘量延長

for t in majorPowers: ww2.extend(t) 

sum(majorPowers,[]) 
0

我會使用減少:

from operator import add 
ww2 = reduce(add, majorPowers) 
+0

Downvote無評論? – robince 2009-11-19 11:12:13