python - 将列表拆分为另一个列表指定的大小

标签 python list iterator slice

假设有一个列表 X 和另一个列表 num_items 指定应该在子列表中的项目数,我可以这样手动拆分列表:

>>> x = list(range(10))
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> num_items = [4, 4, 2]

>>> slice1 = x[:num_items[0]]
>>> slice2 = x[len(slice1):len(slice1)+num_items[1]]
>>> slice3 = x[len(slice1)+len(slice2):]
>>> slice1, slice2, slice3
([0, 1, 2, 3], [4, 5, 6, 7], [8, 9])

在两种情况下,最后几个切片可能会出现问题,例如但这可以用空列表解决,因为我手动对 3 个切片进行编码:

>>> num_items = [9, 1, 1]
>>> slice1 = x[:num_items[0]]
>>> slice2 = x[len(slice1):len(slice1)+num_items[1]]
>>> slice3 = x[len(slice1)+len(slice2):]
>>> slice1, slice2, slice3
([0, 1, 2, 3, 4, 5, 6, 7, 8], [9], [])

如果有 4 个切片怎么办,例如:

>>> num_items = [9, 1, 1, 2]
>>> slice1 = x[:num_items[0]]
>>> slice2 = x[len(slice1):len(slice1)+num_items[1]]
>>> slice3 = x[len(slice1)+len(slice2):len(slice1)+len(slice2)+num_items[2]]
>>> slice4 = x[len(slice1)+len(slice2)+len(slice3): len(slice)+len(slice2)+len(slice3)+num_items[3]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'type' has no len()

期望的输出是将空列表添加到第 4 个切片,即:

>>> slice1, slice2, slice3, slice4
([0, 1, 2, 3, 4, 5, 6, 7, 8], [9], [], [])

如果 num_items 需要的项目少于 X 的长度,只需返回直到 num_items 的总和,即

>>> num_items = [4, 4]
>>> slice1, slice2
([0, 1, 2, 3], [4, 5, 6, 7])

主要问题是有没有一种方法可以在不手动编码拆分的情况下拆分切片?(涵盖 num_items 请求更多项目的情况的答案比在 X 中,在那种情况下,应该返回空的子列表)

请记住,X 的长度可能相当大(即 > 10,000,000,000),但 num_items 的长度范围为 1 到 100 =)

最佳答案

粗略但简单的方法。

>>> x = list(range(10))
>>> num_items = [2,3,4,1]
>>> cur_sum = 0
>>> slices = []
>>> for i in num_items:
...     slices.append(x[cur_sum:cur_sum+i])
...     cur_sum += i
... 
>>> slices
[[0, 1], [2, 3, 4], [5, 6, 7, 8], [9]]

关于python - 将列表拆分为另一个列表指定的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42693025/

相关文章:

python - 什么是最Pythonic的方法来排序调用对象方法而不需要

python - 使用 imaplib 从特定收件箱接收电子邮件时出错

java - 显示一个 ArrayList?

c# - 如何在执行枚举时管理不断变化的列表?

python - Plotly:plotly 表达遵循什么颜色循环?

c# - 为 .NET 应用程序创建交互式 shell,并将 python/iron python 等脚本语言嵌入其中

python 获取列表中的字典值

c++ - 根据 C++ ISO 标准,什么是多次通过保证?

java - Iterator for Java Framework Collection 的不同结果

python - Python 中迭代器的静态行为