【问题标题】:Chunk nested lists starting on their deepest level从最深层次开始的块嵌套列表
【发布时间】:2026-01-13 13:50:01
【问题描述】:

我想要一个函数,根据这个方案将我的列表分成一个子列表,然后将这些子列表分成更多的子列表。嵌套数和块大小会有所不同。请注意lst2中的[4]和[9],这是必不可少的。

block_sizes = [5, 2, 1]
my_lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

# desired return
lst1 = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]] # chunked into sublists of size 5
lst2 = [[0, 1], [2, 3], [4], [5, 6], [7, 8], [9], [10, 11]] # chunked into sublists of size 2; be aware of [4] and [9]
lst3 = [[0], [1], [2], [3], [4], [5], ... [11]]

我已经尝试过了,但是分块没有按预期工作:

block_sizes = [5, 2, 1]

def chunk_into_list(lst, chunk_size):
    return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]

for i, block_size in enumerate(block_sizes):

    for step in range(len(block_sizes[:(i + 1)])):
        my_lst = chunk_in_sizes(my_lst, block_sizes[step])

    print(my_lst)

但这会导致:

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

我将使用它进行模拟,所以如果可能的话,效率很重要。

【问题讨论】:

  • 顺便说一句,不要使用列表作为变量名。
  • 我知道了,谢谢。只是为了提出我的问题。
  • 如果您意识到这一点,请不要将这个错误传播给未来数百万的程序员。
  • 你说的有道理,我更正了。

标签: python arrays recursion nested-loops


【解决方案1】:

你的意思是:

lst = [0,1,2,3,4,5,6,7,8,9,10,11]
for block_size in block_sizes:
    print(chunk_in_sizes(lst, block_size))

【讨论】:

  • 不,这不是我需要的。请注意我想要的结果中的 list2,其中 [4] 和 [9] 是其子列表中的唯一元素,就像它们之前在 5 元素列表之一中一样。
【解决方案2】:

我猜这不是最理想的方式,但据我所知,它会做你想做的事。

block_sizes = [5, 2, 1]
my_lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

def chunk_into_list(lst, chunk_size):
    if lst and isinstance(lst[0], list):
        lst_new = []
        for nested_lst in lst:
            lst_new += (chunk_into_list(nested_lst, chunk_size))
        return lst_new
    else:
        return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]


for i, block_size in enumerate(block_sizes):
    for step in range(len(block_sizes[:(i + 1)])):
        my_lst = chunk_into_list(my_lst, block_sizes[step])

    print(my_lst)

#Output
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11]]
[[0, 1], [2, 3], [4], [5, 6], [7, 8], [9], [10, 11]]
[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]]

【讨论】:

  • 非常感谢您(以及所有其他贡献者)!是的,这会导致预期的结果!我希望有一个更有效的解决方案,但这也可以。
  • 我还不能复制它。有时我会收到错误“if isinstance(lst[0], list): IndexError: list index out of range”有什么办法解决这个问题吗?
  • 如果 chunk_into_list 中的 list lst 为空,可能会发生这种情况。为避免这种情况,您应该这样做:将“if isinstance(lst[0], list):”替换为“if lst and isinstance(lst[0], list):”。在这种情况下,if-condition 返回 False,因为列表为空,甚至不会检查第二部分 (isinstance(lst[0], list))。
  • 再次感谢!这似乎行得通。我不确定这是否会改变整体结果