2011-09-26 18 views
94

可能性の重複:二つのリストにペアのリスト/タプルを開梱/タプル

I:
A Transpose/Unzip Function in Python

私はこのようになりますリストを持っていますリストを2つのリストに分けたい

list1 = ('1','2','3','4') 
list2 = ('a','b','c','d') 

私は例のためにそれを行うことができます。

list1 = [] 
list2 = [] 
for i in list: 
    list1.append(i[0]) 
    list2.append(i[1]) 

しかし、私はよりエレガントな解決策があるかどうかを知りたいです。

+7

変数には組み込みの型名を使用しないでください。 'list'と呼ばないでください。変数 'list'を作成すると、組み込み関数' list() 'があなたの変数によって隠されてしまって奇妙なことが起こり始めるでしょう。 –

+2

これはタプルであり、リストではありません。同様に使用することはできますが、Pythonでそのまま使用することは重要です。 –

答えて

183
>>> source_list = ('1','a'),('2','b'),('3','c'),('4','d') 
>>> list1, list2 = zip(*source_list) 
>>> list1 
('1', '2', '3', '4') 
>>> list2 
('a', 'b', 'c', 'd') 

編集:zip(*iterable)は、独自の逆数であることを注:

>>> list(source_list) == zip(*zip(*source_list)) 
True 

二つのリストに開梱すると、これは次のようになります。rocksportrockerによって提案された

>>> list1, list2 = zip(*source_list) 
>>> list(source_list) == zip(list1, list2) 
True 

追加。

+5

OPには、 "splat"オペレータについて知らない場合はhttp://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-pythonが役立ちます。 – dicato

+5

'zip(* list_of_pairs)'の結果は 'list'のペアではなく' tuple'のペアであることを指摘したいと思います。その差は、場合によっては重要である(例えば、それに追加する)ことができる。したがって、この例の 'list1'と' list2'は実際には 'tuple1'と' tuple2'です。 – Causality

+0

@原因確かに真です。私は質問に使われているのと同じ名前を使用しました。その名前は 'タプル 'です。間違いは、これが最初に投稿されたときの質問に対するコメントで指摘されました:http://stackoverflow.com/questions/7558908/unpacking-a-list-tuple-of-pairs-into-two-lists-tuples/ 7558990?noredirect = 1#comment9163175_7558908 – agf

17
list1= (x[0] for x in source_list) 
list2= (x[1] for x in source_list) 
+2

実際の 'list'sを索引化する必要がある場合は、括弧の代わりに大括弧' [] 'を使用して、ジェネレータ式の代わりにリスト内包を作成する必要があります。 – agf

+0

-1の場合、zip()の解法はよりpythonであり、ループのために2つのループを持たない。 – naeg

+7

@naeg、これは完璧に正しいpython表現である。あまり訓練されていないプログラマーにとっては、これはかなり霧のような 'zip(* ...)'構文を使うよりも優れた解決策であると主張することさえできます。 – KillianDS

関連する問題