Skip to content

Commit a66e166

Browse files
author
naipawat.poo@student.mahidol.ac.th
committed
bites 222 - itertools islice
1 parent 5db614f commit a66e166

3 files changed

Lines changed: 75 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,4 @@
7070
/187/README.md
7171
/148/README.md
7272
/197/README.md
73+
/222/README.md

222/grouping.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import types
2+
from itertools import islice
3+
4+
5+
def group(iterable, n):
6+
"""Splits an iterable set into groups of size n and a group
7+
of the remaining elements if needed.
8+
9+
Args:
10+
iterable (list): The list whose elements are to be split into
11+
groups of size n.
12+
n (int): The number of elements per group.
13+
14+
Returns:
15+
list: The list of groups of size n,
16+
where each group is a list of n elements.
17+
"""
18+
iterable_list = list(iterable)
19+
return [list(islice(iterable_list, x, x+n)) for x in range(0, len(iterable_list), n)]
20+
21+
22+
if __name__ == '__main__':
23+
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
24+
gen = (i for i in iterable)
25+
n = 3
26+
ret = group(gen, n)
27+
print(ret)

222/test_grouping.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import types
2+
3+
from grouping import group
4+
5+
6+
def test_split_10_ints_by_3():
7+
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
8+
n = 3
9+
actual = group(iterable, n)
10+
expected = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
11+
assert actual == expected
12+
13+
14+
def test_passing_in_tuple():
15+
iterable = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
16+
n = 3
17+
actual = group(iterable, n)
18+
expected = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
19+
assert actual == expected
20+
21+
22+
def test_passing_in_generator():
23+
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
24+
gen = (i for i in iterable)
25+
assert isinstance(gen, types.GeneratorType)
26+
n = 3
27+
actual = group(gen, n)
28+
expected = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
29+
assert actual == expected
30+
31+
32+
def test_different_iterable_size():
33+
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 2
34+
n = 3
35+
actual = group(iterable, n)
36+
expected = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2],
37+
[3, 4, 5], [6, 7, 8], [9, 10]]
38+
assert actual == expected
39+
40+
41+
def test_different_n():
42+
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 2
43+
n = 5
44+
actual = group(iterable, n)
45+
expected = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],
46+
[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
47+
assert actual == expected

0 commit comments

Comments
 (0)