def grouper(iterable, n, fillvalue=None): "Collect data into fixed-length chunks or blocks" # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return zip_longest(*args, fillvalue=fillvalue)
雖然我用的不是這個方法,但這方法很有趣,又學到新東西了
想提一下在 python 3.13 的官方文檔中這個範例變成怎樣了
def grouper(iterable, n, *, incomplete='fill', fillvalue=None): "Collect data into non-overlapping fixed-length chunks or blocks." # grouper('ABCDEFG', 3, fillvalue='x') → ABC DEF Gxx # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF iterators = [iter(iterable)] * n match incomplete: case 'fill': return zip_longest(*iterators, fillvalue=fillvalue) case 'strict': return zip(*iterators, strict=True) case 'ignore': return zip(*iterators) case _: raise ValueError('Expected fill, strict, or ignore') |
在這個版本中,展示更多不同的 group 行為,共有三個不同的模式,可以透過傳入 incomplete 這個參數修改
和之前版本的區別在於不完全依賴 itertools.zip_longest,而是用 zip 就可以做
在這題目中,我們只需要用到 ignore 模式,自己手搓就可以了
因為 ZeorJudge 的 python 版本只有到 3.6 ,而 3.6 版的 zip 沒有 strict 參數,且長度並非完全平方數的字串你應該要在更前面就用 if 篩掉
把範例中那些用不到的部分去掉,就是我們需要的函數
def grouper(iterable, n): |
當然,這個不是最終答案,還要再處理過,怎麼處理就自己來吧,一樓都有教了