2

重複の可能性:
Python でリストを均等なサイズのチャンクに分割するにはどうすればよいですか?

やあ、

次のように、リストを x 要素の長さの多くのリストに分割したいと思います。

a = (1, 2, 3, 4, 5)

そして得る:

b = ( (1,2), (3,4), (5,) )

長さが 2 または に設定されている場合:

b = ( (1,2,3), (4,5) )

長さが 3 の場合 ...

これを書く良い方法はありますか?それ以外の場合は、イテレータを使用して記述するのが最善の方法だと思います...

4

3 に答える 3

3

これが私がそれを行う方法です。繰り返しですが、リスト内包表記です。タイプが混在することに注意してください。これは、望ましい場合と望ましくない場合があります。

def sublist(seq, length):
    return [seq[i:i + length] for i in xrange(0, len(seq), length)]

使用法:

>>> sublist((1, 2, 3, 4, 5), 1)
[(1,), (2,), (3,), (4,), (5,)]

>>> sublist([1, 2, 3, 4, 5], 2)
[[1, 2], [3, 4], [5]]

>>> sublist('12345', 3)
['123', '45']

>>> sublist([1, 2, 3, 4, 5], 73)
[[1, 2, 3, 4, 5]]

>>> sublist((1, 2, 3, 4, 5), 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in sublist
ValueError: xrange() arg 3 must not be zero

もちろん、必要にtuple応じて も簡単に作成できます。リスト内包表記[...]を に置き換えますtuple(...)。または、固定型seq[i:i + length]を返すように置き換えることもできます。tuple(seq[i:i + length])list(seq[i:i + length])

于 2010-11-13T01:14:58.210 に答える
2

itertools モジュールのドキュメント。読んで、学んで、愛してください。

具体的には、レシピセクションから:

import itertools

def grouper(n, iterable, fillvalue=None):
  "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
  args = [iter(iterable)] * n
  return itertools.izip_longest(fillvalue=fillvalue, *args)

これにより、次のことが得られます。

>>> tuple(grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5, None))

これはあなたが望むものとはまったく異なります...あなたはそこに入れたくないNone...そうです。簡単な修正:

>>> tuple(tuple(n for n in t if n) for t in grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5))

リスト内包表記を毎回入力するのが気に入らない場合は、そのロジックを関数に移動できます。

def my_grouper(n, iterable):
  "my_grouper(3, 'ABCDEFG') --> ABC DEF G"
  args = [iter(iterable)] * n
  return tuple(tuple(n for n in t if n)
       for t in itertools.izip_longest(*args))

これにより、次のことが得られます。

>>> tuple(my_grouper(3, (1,2,3,4,5)))
((1, 2, 3), (4, 5))

終わり。

于 2010-11-13T01:37:14.127 に答える
2

itertools モジュールの python ドキュメントから:

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

例:

>>> tuple(grouper(3, (1, 2, 3, 4, 5, 6, 7)))
((1, 2, 3), (4, 5, 6), (7, None, None))
于 2010-11-13T01:44:39.597 に答える