やあ、
次のように、リストを x 要素の長さの多くのリストに分割したいと思います。
a = (1, 2, 3, 4, 5)
そして得る:
b = (
(1,2),
(3,4),
(5,)
)
長さが 2 または に設定されている場合:
b = (
(1,2,3),
(4,5)
)
長さが 3 の場合 ...
これを書く良い方法はありますか?それ以外の場合は、イテレータを使用して記述するのが最善の方法だと思います...
やあ、
次のように、リストを x 要素の長さの多くのリストに分割したいと思います。
a = (1, 2, 3, 4, 5)
そして得る:
b = (
(1,2),
(3,4),
(5,)
)
長さが 2 または に設定されている場合:
b = (
(1,2,3),
(4,5)
)
長さが 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])
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))
終わり。
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))