2012-06-07 204 views
28

如何轉換將元組列表轉換爲列表?

[(1,), (2,), (3,)] 

[1, 2, 3] 
+0

可能重複[python - 獲取元組第一個索引?](https://stackoverflow.com/questions/10735282/python-get-list-of-tuples-first-index) –

回答

40

@Le馮的解決方案完美適合您的情況。請注意,如果元組中的元素數量可變,您還可以使用從itertools

>>> a = [(1,), (2, 3), (4, 5, 6)] 
>>> from itertools import chain 
>>> list(chain(a)) 
[(1,), (2, 3), (4, 5, 6)] 
>>> list(chain(*a)) 
[1, 2, 3, 4, 5, 6] 
>>> list(chain.from_iterable(a)) # More efficient version than unpacking 
[1, 2, 3, 4, 5, 6] 
+10

還有'chain.from_iterable ()'它爲你解包。 – stranac

+0

感謝您的提示! – fanti

7
>>> a = [(1,), (2,), (3,)] 
>>> zip(*a)[0] 
(1, 2, 3) 

有關列表:

>>> list(zip(*a)[0]) 
[1, 2, 3] 
+1

@Levon - 我發現列表comp方式更可讀! – fraxel

+2

我對它也比較熟悉和舒服,但我想了解更多關於zip和itertools的知識,所以這是有益的:) – Levon

+1

@Levon - 明智的舉動;) – fraxel

19

這裏是另一個選擇,如果你可以在元組可變數量的元素:

>>> a = [(1,), (2, 3), (4, 5, 6)] 
>>> [x for t in a for x in t] 
[1, 2, 3, 4, 5, 6] 

這基本上是一個縮短形式的下列循環:

result = [] 
for t in a: 
    for x in t: 
     result.append(x) 
+0

最好的答案,精美簡潔/一般化。但是這個語法非常令人費解。最後一個「for」陳述類似於在列表理解上的尾隨「if」陳述,例如'[我爲我在範圍內(10)如果我%2 == 0]'?我對後者很熟悉。 –

1

你也可以解包列表理解的元組:

e = [(1,), (2,), (3,)] 
[i for (i,) in e] 

還是會給予:

[1, 2, 3] 
3

總是有辦法通過從另一個列表中提取列表... for ... in ...。在這種情況下,這將是:

[i[0] for i in e]

3

您還可以使用sum功能如下:

e = [(1,), (2,), (3,)] 
e_list = list(sum(e,())) 

而且它也列出的清單工程將其轉換成一個列表,但你需要使用它如下:

e = [[1, 2], [3, 4], [5, 6]] 
e_list = list(sum(e, [])) 

這會給你[1, 2, 3, 4, 5, 6]

0

One Liner喲!

list(*zip(*[(1,), (2,), (3,)])) 
1
>>> a = [(1,), (2,), (3,)] 
>>> b = map(lambda x: x[0], a) 
>>> b 
[1, 2, 3] 

這是在使用python內置函數

0

使用操作員或總結

>>> import operator 
>>> a = [(1,), (2,), (3,)] 
>>> list(reduce(operator.concat, a)) 
[1, 2, 3] 

(OR)

>>> list(sum(a,())) 
[1, 2, 3] 
>>> 
一行的最佳解決方案