To loop through a set of code a specified number of times, we can use the range() function, The range() function returns a sequence of numbers, starting from 0 by default, and increments by 1 (by default), and ends at a specified number.
In Python 3, zip returns an iterator of tuples, like itertools. izip in Python2. To get a list of tuples, use list(zip(foo, bar)) . And to zip until both iterators are exhausted, you would use itertools.
A generator function would be neat:
def batch_gen(data, batch_size):
for i in range(0, len(data), batch_size):
yield data[i:i+batch_size]
Example use:
a = "abcdef"
for i in batch_gen(a, 2): print i
prints:
ab
cd
ef
I've got an alternative approach, that works for iterables that don't have a known length.
def groupsgen(seq, size):
it = iter(seq)
while True:
values = ()
for n in xrange(size):
values += (it.next(),)
yield values
It works by iterating over the sequence (or other iterator) in groups of size, collecting the values in a tuple. At the end of each group, it yield the tuple.
When the iterator runs out of values, it produces a StopIteration exception which is then propagated up, indicating that groupsgen is out of values.
It assumes that the values come in sets of size (sets of 2, 3, etc). If not, any values left over are just discarded.
Don't forget about the zip() function:
a = 'abcdef'
for x,y in zip(a[::2], a[1::2]):
print '%s%s' % (x,y)
I am sure someone is going to come up with some more "Pythonic" but how about:
for y in range(0, len(x), 2):
print "%s%s" % (x[y], x[y+1])
Note that this would only work if you know that len(x) % 2 == 0;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With