2009-08-14 6 views
104

zip()のように動作し、組み込み関数が、その意志パッドは、結果ありますか?Python:長めの長さにパッドするジップライクな機能?結果リストの長さは最長<em></em>入力ではなく、<em>最短</em>入力の長さになるように

>>> a=['a1'] 
>>> b=['b1','b2','b3'] 
>>> c=['c1','c2'] 

>>> zip(a,b,c) 
[('a1', 'b1', 'c1')] 

>>> What command goes here? 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+0

'itertools' **が**内蔵されている、でもモジュールでけれども。 –

答えて

137

あなたはitertools.izip_longest(パイソンを2.6+)を使用するか、またはあなたがNonemapを使用することができます。 feature of map(ただし、mapはPython 3.xで変更されているため、これはPython 2.xでのみ動作します)。

>>> map(None, a, b, c) 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+2

@ SilentGhost、私はこれがpy3kでは動作しないというあなたの言葉を取った。私は確認するpy3kがありません。 –

+1

'>>>リスト トレースバック(直近の最後の呼び出し): ファイル" "、行1、 list(map(なし、a、b、c) )) TypeError: 'NoneType'オブジェクトは呼び出し可能ではありません。 ' – SilentGhost

+0

また、docsを参照することもできます:http://docs.python.org/3.1/library/functions.html#map – SilentGhost

74

Python 2.6xでは、itertoolsモジュールのizip_longestを使用してください。

代わりにzip_longestを使用してください(先頭はi)。

>>> list(itertools.izip_longest(a, b, c)) 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+7

Python 2とPython 3の両方のコードを互換にしたい場合は、代わりに 'six.moves.zip_longest'を使うことができます。 – Gamrix

2

非itertoolsのPython 3溶液:

def zip_longest(*lists): 
    def g(l): 
     for item in l: 
      yield item 
     while True: 
      yield None 
    gens = [g(l) for l in lists]  
    for _ in range(max(map(len, lists))): 
     yield tuple(next(g) for g in gens) 
関連する問題