izip
是一個不錯的選擇,但在這裏,因爲你不滿意它的幾個備選方案:
>>> def chunker(seq, size):
... return (tuple(seq[pos:pos+size]) for pos in xrange(0, len(seq), size))
...
>>> x = range(11)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> chunker(x, 2)
<generator object <genexpr> at 0x00B44328>
>>> list(chunker(x, 2))
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10,)]
>>> list(izip(x[1::2], x[::2]))
[(1, 0), (3, 2), (5, 4), (7, 6), (9, 8)]
正如你所看到的,這有妥善處理的大小不均的元素,優勢這可能對你不重要。還有這個配方從itertools documentation itself:
>>> def grouper(n, iterable, fillvalue=None):
... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
... args = [iter(iterable)] * n
... return izip_longest(fillvalue=fillvalue, *args)
...
>>>
>>> from itertools import izip_longest
>>> list(grouper(2, x))
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, None)]
在這種情況下函數和方法有什麼區別? – 2009-06-10 08:11:07
這取決於上面的代碼是否是類或頂級的一部分。如果它在一個被大量重用的類中,那麼使用一個方法可能是有意義的。當使用一個函數時,在任何類外部重複使用會更簡單,但會混淆全局名稱空間。 – 2009-06-10 08:18:28
它在一個類中,但是這個循環只在一個地方執行,所以我認爲有必要從中做出一個方法。無論如何感謝 – uolot 2009-06-10 08:44:38