Python equivalent of Ruby's each_slice(count)

Viewed 3113

What is pythons equivalent of Ruby's each_slice(count)?
I want to take 2 elements from list for each iteration.
Like for [1,2,3,4,5,6] I want to handle 1,2 in first iteration then 3,4 then 5,6.
Ofcourse there is a roundabout way using index values. But is there a direct function or someway to do this directly?

6 Answers

I know this has been answered by multiple experts on the language, but I have a different approach using a generator function that is easier to read and reason about and modify according to your needs:

def each_slice(list: List[str], size: int):
    batch = 0
    while batch * size < len(list):
        yield list[batch * size:(batch + 1) * size]
        batch += 1   

slices = each_slice(["a", "b", "c", "d", "e", "f", "g"], 2)
print([s for s in slices])

$ [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g']]

If you need each slice to be of batch size, maybe pad None, or some default character you can simply add padding code to the yield. If you want each_cons instead, you can do that by modifying the code to move one by one instead of batch by batch.

s_size = 4
l = list(range(100))

while len(l) > 0:
    slice = [l.pop() for _e,i in enumerate(l) if i <= s_size ]
    print(slice)
Related