【问题标题】:Split Python list into custom chunk size based on second list根据第二个列表将 Python 列表拆分为自定义块大小
【发布时间】:2016-11-25 05:48:58
【问题描述】:

我正在寻找一种将列表拆分为预定义切片的方法:

a = list(range(1, 1001)) # Added list() 
b = [200, 500, 300]

列表a 应该被分割成len(b) 子列表,其中包含a 的前200 个元素、后500 个元素和最后300 个元素。可以安全地假设sum(b) == len(a)

这个有通用的功能吗?

【问题讨论】:

    标签: python list slice


    【解决方案1】:

    从列表中创建一个迭代器(如果它还不是),并从迭代器中为b 中的每个n 获取n 乘以next 元素。

    >>> a = range(1, 1001)
    >>> b = [200, 500, 300]
    >>> a_iter = iter(a)
    >>> [[next(a_iter) for _ in range(n)] for n in b]
    [[1,
      2,
      ...
      199,
      200],
     [201,
      ...
      700],
     [701,
      702,
      ...
      999,
      1000]]
    

    【讨论】:

    • 已解决,一旦系统允许,我会在 5 分钟内接受 :)。
    • 如果块大于 a 的内容,您需要在 next 上设置默认值以避免异常
    【解决方案2】:

    您还可以使用itertools.islice 在预定义的块中使用a 的迭代器:

    >>> from itertools import islice
    >>> b = [200, 500, 300]
    >>> a = range(1, 1001)
    >>> it  = iter(a)
    >>> [list(islice(it, i)) for i in b]
    

    【讨论】:

      【解决方案3】:

      itertools.islice:

      from itertools import islice
      
      a = range(1, 1001)
      b = [200, 500, 300]
      
      c = iter(a)
      results = [list(islice(c, length)) for length in b]
      

      islice 的行为类似于 slice,只是 slice 接受序列并返回序列,而 islice 接受迭代并返回迭代。

      迭代器是“一次性的”——一旦你从中提取元素,它就不再存在,并且下一个元素成为新的第一个元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-10
        • 2015-12-13
        • 1970-01-01
        • 2013-11-26
        • 2020-01-14
        • 2020-10-07
        • 2012-07-01
        • 1970-01-01
        相关资源
        最近更新 更多