Skip to content

Commit b5fc2ef

Browse files
committed
functional group iterable
1 parent 905106b commit b5fc2ef

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
flat = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,]
2+
flat_iter = iter(flat)
3+
4+
N = 3
5+
g = (tuple(next(flat_iter) for i in range(N)) for row in range(len(flat) // N))
6+
print(list(g))
7+
8+
remain_items = []
9+
for remain_item in flat_iter:
10+
remain_items.append(remain_item)
11+
12+
remain_items_len = len(remain_items)
13+
how_many_to_add = N - remain_items_len
14+
15+
if how_many_to_add < N:
16+
for _ in range(how_many_to_add):
17+
remain_items.append(None)
18+
19+
print(tuple(remain_items))
20+
21+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from typing import TypeVar
2+
from typing import Sequence
3+
from typing import List
4+
from typing import Tuple
5+
from typing import Iterator
6+
7+
8+
ItemType = TypeVar('ItemType')
9+
Flat = Sequence[ItemType]
10+
Grouped = List[Tuple[ItemType, ...]]
11+
12+
Flat_Iter = Iterator[ItemType]
13+
Grouped_iter = Iterator[Tuple[ItemType, ...]]
14+
15+
16+
def group_by_seq(n: int, sequence: Flat) -> Grouped:
17+
flat_iter = iter(sequence)
18+
full_sized_items = list(
19+
tuple(
20+
(next(flat_iter) for i in range(n)))
21+
for row in range(len(sequence) // n)
22+
)
23+
24+
trailer = tuple(flat_iter)
25+
if trailer:
26+
return full_sized_items + [trailer]
27+
else:
28+
return full_sized_items
29+
30+
31+
def group_by_iter(n: int, iterable: Flat_Iter) -> Grouped_iter:
32+
row = tuple(next(iterable) for i in range(n))
33+
while row:
34+
yield row
35+
row = tuple(next(iterable) for i in range(n))
36+
37+
38+
if __name__ == '__main__':
39+
flat = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, ]
40+
g = group_by_seq(3, flat)
41+
print(g)
42+
43+
flat2 = [1]
44+
print(list(group_by_iter(3, iter(flat))))
45+

0 commit comments

Comments
 (0)