2017-03-24 14 views
0

タプルのリストを1つのタプルに変換する方法はありますか?私はcursor.fetchall()からのタプルのリストを受け取っているが、単一のタプルにこれをしたいと思います。たとえばPythonタプルのリストを単一タプルに変換する

curr_table_columns = cursor.fetchall() 

[(u'w_id',), (u'w_name',), (u'w_street',)] 

[(u'w_id', u'w_name', u'w_street')] 

答えて

3

With itertools.chain、それは自明です。 from itertools import chainとあなたが行うことができ、次のいずれか

[tuple(chain.from_iterable(curr_table_columns))] 

か:(無制限のためtupleでラップしていないのに!)

[tuple(chain(*curr_table_columns))] 

前者は、長いまたは無制限反復可能な入力のために好ましいです。小さな入力(特に、すでにlistまたはtupleのもの)の場合、後者はやや遅くなりますが、大丈夫です。いずれも、genexprよりもはるかに高速で、任意のサイズのインプットに対してインデックスを作成することになります。

+0

私の答え+1にあなたのコメントをありがとう+1 – bernie

+1

@バーニー:私はあなたのことを編集すると思った;あなたが削除したので自分の投稿のみ投稿しました。 :-) – ShadowRanger

+0

心配はいりません! :-) – bernie

2

てみなりこれは:

a=[(u'w_id',), (u'w_name',), (u'w_street',)] 

print [tuple([i[0] for i in a])] 

出力:

[(u'w_id', u'w_name', u'w_street')] 
2

ない効率的な*が、それは簡単です:あなたがしなければならない場合

>>> ts = [(u'w_id',), (u'w_name',), (u'w_street',)] 
>>> sum(ts,()) 
('w_id', 'w_name', 'w_street') 

ので、ちょうどリストでラップ:

>>> result = [sum(ts,())] 
>>> result 
[('w_id', 'w_name', 'w_street')] 

*警告:二次的に拡大縮小します。いくつかは、いくつかの列名を1つのコンテナに結合するためのスライドであるようにする傾向があります。間違いなく、この方法で数百万のタプルを処理しようとしないでください。

直線時間の間、itertools溶液を使用してください。

+0

注:[sum 'docs](https://docs.python.org/3/library/functions.html#sum)自身は、この目的のために' sum'を使用することを推奨しません(代わりに 'itertools.chain'を推奨します)。それは機能しますが、入力が大きくなるとスケーリングはひどいものになります( 'sum'はシーケンスと一緒に使用される場合、Schlemiel the Painter's algorithm(https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm)です)。 – ShadowRanger

関連する問題