-
-
Notifications
You must be signed in to change notification settings - Fork 34.5k
GH-98363: Add itertools.batched() #98364
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 22 commits
057390d
047c441
9061042
72a03c6
21a6f67
61b83df
93bf013
eb6949c
7fd4016
8fb8bdf
2b994a3
fa9c306
c49fb17
3fbc9c5
4c25341
41acb45
77de77c
7390670
c836bc7
c0ca79d
8238c28
b9cbb46
4799e6a
bac2f6c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -48,6 +48,7 @@ Iterator Arguments Results | |||||
| Iterator Arguments Results Example | ||||||
| ============================ ============================ ================================================= ============================================================= | ||||||
| :func:`accumulate` p [,func] p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) --> 1 3 6 10 15`` | ||||||
| :func:`batched` p, n [p0, p1, ..., p_n-1], ... ``batched('ABCDEFG') --> ABC DEF G`` | ||||||
| :func:`chain` p, q, ... p0, p1, ... plast, q0, q1, ... ``chain('ABC', 'DEF') --> A B C D E F`` | ||||||
| :func:`chain.from_iterable` iterable p0, p1, ... plast, q0, q1, ... ``chain.from_iterable(['ABC', 'DEF']) --> A B C D E F`` | ||||||
| :func:`compress` data, selectors (d[0] if s[0]), (d[1] if s[1]), ... ``compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F`` | ||||||
|
|
@@ -170,6 +171,45 @@ loops that truncate the stream. | |||||
| .. versionchanged:: 3.8 | ||||||
| Added the optional *initial* parameter. | ||||||
|
|
||||||
|
|
||||||
| .. function:: batched(iterable, n) | ||||||
|
|
||||||
| Batch data from the *iterable* into lists of length *n*. The last | ||||||
| batch may be shorter than *n*. | ||||||
|
|
||||||
| Loops over the input iterable and accumulates data into lists up to | ||||||
| size *n*. The input is consumed lazily, just enough to fill a list. | ||||||
| The result is yielded as soon as the batch is full or when the input | ||||||
| iterable is exhausted: | ||||||
|
|
||||||
| .. doctest:: | ||||||
|
|
||||||
| >>> flattened_data = ['roses', 'red', 'violets', 'blue', 'sugar', 'sweet'] | ||||||
| >>> unflattened = list(batched(flattened_data, 2)) | ||||||
| >>> unflattened | ||||||
| [['roses', 'red'], ['violets', 'blue'], ['sugar', 'sweet']] | ||||||
|
|
||||||
| >>> for batch in batched('ABCDEFG', 3): | ||||||
| ... print(batch) | ||||||
| ... | ||||||
| ['A', 'B', 'C'] | ||||||
| ['D', 'E', 'F'] | ||||||
| ['G'] | ||||||
|
|
||||||
| Roughly equivalent to:: | ||||||
|
|
||||||
| def batched(iterable, n): | ||||||
| "Batch data into lists of length n. The last batch may be shorter." | ||||||
| # batched('ABCDEFG', 3) --> ABC DEF G | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe tweak the example so it cannot be misunderstood as "return 3 batches"? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| if n < 1: | ||||||
| raise ValueError('n must be at least one') | ||||||
| it = iter(iterable) | ||||||
| while (batch := list(islice(it, n))): | ||||||
| yield batch | ||||||
|
|
||||||
| .. versionadded:: 3.12 | ||||||
|
|
||||||
|
|
||||||
| .. function:: chain(*iterables) | ||||||
|
|
||||||
| Make an iterator that returns elements from the first iterable until it is | ||||||
|
|
@@ -858,13 +898,6 @@ which incur interpreter overhead. | |||||
| else: | ||||||
| raise ValueError('Expected fill, strict, or ignore') | ||||||
|
|
||||||
| def batched(iterable, n): | ||||||
| "Batch data into lists of length n. The last batch may be shorter." | ||||||
| # batched('ABCDEFG', 3) --> ABC DEF G | ||||||
| it = iter(iterable) | ||||||
| while (batch := list(islice(it, n))): | ||||||
| yield batch | ||||||
|
|
||||||
| def triplewise(iterable): | ||||||
| "Return overlapping triplets from an iterable" | ||||||
| # triplewise('ABCDEFG') --> ABC BCD CDE DEF EFG | ||||||
|
|
@@ -1236,36 +1269,6 @@ which incur interpreter overhead. | |||||
| >>> list(grouper('abcdefg', n=3, incomplete='ignore')) | ||||||
| [('a', 'b', 'c'), ('d', 'e', 'f')] | ||||||
|
|
||||||
| >>> list(batched('ABCDEFG', 3)) | ||||||
| [['A', 'B', 'C'], ['D', 'E', 'F'], ['G']] | ||||||
| >>> list(batched('ABCDEF', 3)) | ||||||
| [['A', 'B', 'C'], ['D', 'E', 'F']] | ||||||
| >>> list(batched('ABCDE', 3)) | ||||||
| [['A', 'B', 'C'], ['D', 'E']] | ||||||
| >>> list(batched('ABCD', 3)) | ||||||
| [['A', 'B', 'C'], ['D']] | ||||||
| >>> list(batched('ABC', 3)) | ||||||
| [['A', 'B', 'C']] | ||||||
| >>> list(batched('AB', 3)) | ||||||
| [['A', 'B']] | ||||||
| >>> list(batched('A', 3)) | ||||||
| [['A']] | ||||||
| >>> list(batched('', 3)) | ||||||
| [] | ||||||
| >>> list(batched('ABCDEFG', 2)) | ||||||
| [['A', 'B'], ['C', 'D'], ['E', 'F'], ['G']] | ||||||
| >>> list(batched('ABCDEFG', 1)) | ||||||
| [['A'], ['B'], ['C'], ['D'], ['E'], ['F'], ['G']] | ||||||
| >>> list(batched('ABCDEFG', 0)) | ||||||
| [] | ||||||
| >>> list(batched('ABCDEFG', -1)) | ||||||
| Traceback (most recent call last): | ||||||
| ... | ||||||
| ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize. | ||||||
| >>> s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | ||||||
| >>> all(list(flatten(batched(s[:n], 5))) == list(s[:n]) for n in range(len(s))) | ||||||
| True | ||||||
|
|
||||||
| >>> list(triplewise('ABCDEFG')) | ||||||
| [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')] | ||||||
|
|
||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| Added itertools.batched() to batch data into lists of a given length with | ||
| the last list possibly being shorter than the others. |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Uh oh!
There was an error while loading. Please reload this page.