いまさらだけどPython にも zip関数があるのを知った。というか見逃していた。
>>> a = range(5) >>> a [0, 1, 2, 3, 4] >>> b = ['a', 'b', 'c', 'd', 'e'] >>> zip(a, b) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]
今まで↓こう書いてたよ。ばかみたい。zipのほうがよっぽどすっきりしている。
>>> map(lambda x, y: (x, y), a, b) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]
とはいえ、違いもある。
zipは長さを短いほうにあわせる。
>>> c = ['foo', 'bar', 'baz'] >>> zip(a, c) [(0, 'foo'), (1, 'bar'), (2, 'baz')]
mapだと長いほうにあわせて、足りない部分にはNoneが入る。
>>> map(lambda x, y: (x, y), a, c) [(0, 'foo'), (1, 'bar'), (2, 'baz'), (3, None), (4, None)]
itertools.izipとかitertools.izip_longestというのもありますね。