Python:从列表中获取多个列表

2 投票
3 回答
1164 浏览
提问于 2025-04-16 07:00

可能重复的问题:
如何在Python中将列表分割成大小相等的块?

你好,

我想把一个列表分成多个长度为x的子列表,比如:

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

然后得到:

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

如果长度设置为2,或者:

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

如果长度设置为3……

有没有简单的方法来实现这个?否则我觉得最好的办法是用迭代器来写……

3 个回答

2

这是关于Python的itertools模块的官方文档内容:

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))
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]),这样就能返回一个固定类型的结果。

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))

完成。

撰写回答