2012-06-29 91 views
60

我在Python中有方括號的問題。我寫道,產生以下輸出代碼:Flatten list of lists

[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

但我想與執行一些計算,但在方括號不會讓我。

如何去掉括號?我看到了一些例子,但我不能將它們應用於這種情況。

+2

換句話說,你有一個列表的列表,你希望能夠在內部列表的所有成員上工作?另外,由於所有這些內部列表都有一個值,是否值得確保只有值插入到外部列表中?或者有些列表可能有多個元素?儘可能準確地提供所有可能的信息是很重要的。 –

+12

爲了幫助人們在將來回答你的問題,儘量避免像「方括號不會讓我」這樣的一般性陳述,而是給出一個你嘗試去做的事情的具體例子,粘貼一個顯示錯誤結果的小測試代碼。 – DSM

+0

相關的[flatten nested list](http://stackoverflow.com/q/952914/4279) – jfs

回答

10

鑑於

d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

和你具體問題:我怎樣才能去掉括號?

使用列表理解:

new_d = [i[0] for i in d] 

會給你這個

[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 

然後,您可以訪問相應的指標,如個別項目,new_d[0]會給你180.0等,你可以再用於數學。

如果你要有一個數據集合,你會有某種括號或括號。

注意,該解決方案是你的問題/問題專門針對,它並沒有提供一個廣義解。也就是說,它適用於你的情況。

+7

OP對列表沒有太多的想法,給他/她解決方案可能會導致不良影響,如果他/她想使用它來壓扁多個元素(沒有錯誤,只是默默地返回第一個...) – estani

113

使用嵌套列表理解將列表展平爲「刪除括號」。這將取消列入存儲在列表中的每個列表!

list_of_lists = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
flattened = [val for sublist in list_of_lists for val in sublist] 

嵌套列表內涵評估以同樣的方式,他們解開(即添加換行和標籤爲每個新的循環因此,在這種情況下:

flattened = [val for sublist in list_of_lists for val in sublist] 

等同於:

flattened = [] 
for sublist in list_of_lists: 
    for val in sublist: 
     flattened.append(val) 

最大的區別在於,list comp的評估速度比解開的循環快得多,並消除了append調用!

如果你在一個子列表中有多個項目,那麼list comp甚至可以將它扁平化。即

>>> list_of_lists = [[180.0, 1, 2, 3], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> flattened = [val for sublist in list_of_lists for val in sublist] 
>>> flattened 
[180.0, 1, 2, 3, 173.8, 164.2, 156.5, 147.2,138.2] 
+17

使用'itertools.chain.from_iterable'非常簡單。 –

+4

請解釋原因。這就像它變得簡單 –

+5

對不起,我的意思是更具可讀性/直觀性。由於OP難以區分哪些列表(數據序列)和列表如何用代碼表示(帶有方括號),所以我非常懷疑雙列表理解對他/她來說是有意義的。 –

2
>>> lis=[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> [x[0] for x in lis] 
[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 
80

我會用itertools.chain - 這也將滿足每個子列表> 1個元素:

from itertools import chain 
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]])) 
+0

對'itertools' +1,只是要發佈類似的答案,但你打敗了我。 –

+7

你爲什麼要導入一個完整的模塊來做這麼簡單的事情? –

+0

@PaulSeeb @PulSeeb最簡單,通用的內置方法,可以迭代迭代器...如果子列表有100個元素,該怎麼辦?我當然不希望爲那個輸入listcomp代碼... –