如何将列表分为相等的子列表,最后一个子列表由列表的第一个可能的元素组成

时间:2018-09-24 21:37:18

标签: python python-2.7 list

我想将一个列表分成指定长度的子列表。如果最后一块不是指定的长度,则将从列表的第一个元素开始进行扩充。

下面的Python程序会生成除最后一块以外的相等子列表。

def split_list(the_list, chunk_size):
    result_list = []
    while the_list:
        result_list.append(the_list[:chunk_size])
            the_list = the_list[chunk_size:]

    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print split_list(a_list, 3)

输出:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

我想要这样的东西:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]

3 个答案:

答案 0 :(得分:3)

让我们尝试使用tempfile(pattern = "file", tmpdir = tempdir(), fileext = "D:/Documents/PostDoc/collaboration-MYates- CapeRace-PondStocking") tempdir(check = FALSE) itertools.cycle的基于生成器的解决方案:

islice

这样调用函数:

from itertools import cycle, islice         
def split_list(lst, n):    
     it = cycle(lst)
     for i in range(len(lst) // n + len(lst) % n):
         yield list(islice(it, n))

在这里,我个人更喜欢生成器,因为可以一次高效地生成一个块。如果您一次想要所有内容,则可以对结果调用>>> a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(split_list(a_list, 3)) [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]] (就像我已经做过的那样)。

答案 1 :(得分:0)

检查最后一个列表块中是否缺席。如果是这样,请精确添加所需数量的元素,并在列表的最前面进行重复。

def split_list(the_list, chunk_size):
    result_list = []
    short = len(the_list) % chunk_size
    if short:
        # Add wrap-around elements from front of the_list
        the_list.extend(the_list[:chunk_size-short])

    while the_list:
        result_list.append(the_list[:chunk_size])
        the_list = the_list[chunk_size:]

    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(split_list(a_list, 3))

输出:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]

答案 2 :(得分:0)

一种方法是使用列表理解,然后根据需要将列表开头的一部分添加到最终组中。

def split_list(the_list, chunk_size):
    chunks = [the_list[i:i+chunk_size] for i in range(0, len(the_list), chunk_size)]
    chunks[-1] += the_list[:(chunk_size - len(the_list)) % chunk_size]
    return chunks