Python 2 では、一般的な (古い古い) イディオムは、次のようなmap
形式を使用して長さが不均一なイテレータを結合するために使用されます。map(None,iter,iter,...)
>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]
Python 2 では、最長のイテレータが返されるリストの長さになるように拡張され、一方が他方より短い場合は でパディングされNone
ます。
Python 3 では、これが異なります。None
まず、位置 1 の callable の引数として使用することはできません。
>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
OK -- 次のように修正できます。
>>> def f(*x): return x
...
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]
しかし今、私は別の問題を抱えています:最短のイテレータの長さをmap
返します.None
私は Python 2 のコードを Python 3 に移植しているので、これはひどい珍しいイディオムではなく、簡単な解決策を見つけていません。
残念ながら、2to3 ツールはこれを検出しません。
-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18))))
提案?
編集
このイディオムがどれほど一般的かについては、いくつかの議論があります。このSO投稿を参照してください。
高校生の頃に書いたレガシーコードを更新しています。Raymond Hettinger によって書かれ議論されている 2003 年の Python チュートリアルを見てください。マップのこの特定の動作が指摘されています...