私はリストを持っています
L = [1, 2, 3, 4...]
n*3
要素を持っています。みたいなことができるようになりたい
for a, b, c in three_tuple_split(L)
pythonic の方法で、しかし 1 つを思い付くことができません。
私はリストを持っています
L = [1, 2, 3, 4...]
n*3
要素を持っています。みたいなことができるようになりたい
for a, b, c in three_tuple_split(L)
pythonic の方法で、しかし 1 つを思い付くことができません。
非効率的だがpythonicな解決策:
for a, b, c in zip(*[iter(seq)]*3): pass
より効率的な実装については、itertools
グルーパーのレシピをご覧ください。
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
for a, b, c in grouper(3, seq):
pass
スライスと for ループを使用するだけです。
def break_into_chunks(l,n):
x = len(l)
step = x//n
return [l[i:i+step] for i in range(0,x,step)]
または遅いもの:
def break_into_chunks(l,n):
return [l[i:i+len(l)//n] for i in range(0,len(l),len(l)//n)]
使用するには:
for a, b, c in break_into_chunks(L,3):
#!/usr/bin/env python
mylist = range(21)
def three_tuple_split(l):
if len(l)%3 != 0:
raise Exception('bad len')
for i in xrange(0,len(l),3):
yield l[i:i+3]
for a,b,c in three_tuple_split(mylist):
print a,b,c