2015-05-20 59 views
4

我有一個元組列表,其中元組中的一個元素是一個列表。打開列表元組列表

example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)] 

我想只是一個元組

output = [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)] 

question似乎解決與元組的問題,但我很擔心我的用例有在更多的元素列表落得內部清單和

[(a, b, c, d, e) for [a, b, c], d, e in example] 

似乎很單調。有沒有更好的方法來寫這個?

+0

你所有的元組都準確地匹配'([a,b,c],d,e)'模式嗎? – ereOn

+0

是的。我的實際列表有100個元素,但100個是統一的,並且外部總是有2個元素。 – gobrewers14

+3

如果列表中的所有元組都匹配([a,b,c],d,e)的模式,那麼你的代碼是pythonic,看起來並不單調乏味。 – user1823

回答

5

元組可以像列表一樣與+級聯。所以,你可以這樣做:

>>> example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)] 
>>> [tuple(x[0]) + x[1:] for x in example] 
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)] 

請注意,這個工作在Python 2.x和3.x.

4

在Python3你也可以這樣做:

[tuple(i+j) for i, *j in x] 

如果你不想拼出你的輸入

+0

我喜歡它!小心解釋像我這樣可憐的傢伙們究竟發生了什麼事情仍然停留在Python 2.x上? – ereOn

+0

對Python2.x發生'* j'上的'SyntaxError:invalid syntax'。 – wflynny

2

的每一個部分。如果寫一個函數是一個選項:

from itertools import chain 

def to_iterable(x): 
    try: 
     return iter(x) 
    except TypeError: 
     return x, 

example = [([0, 1, 2], 3, 4), ([5, 6, 7], 8, 9)] 
output = [tuple(chain(*map(to_iterable, item))) for item in example] 

其中給出:

print(output) 
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)] 

它比其他解決方案更冗長,但具有工作的整潔優勢,無論內部元組中的列表的位置或數量如何。根據您的要求,這可能是矯枉過正或很好的解決方案。