根据第一个元素的长度递归地将列表分割成子列表。

问题描述 投票:-1回答:2

我正在为这个小问题伤脑筋,我相信这个问题可以(也应该)递归解决。

# split list in sublists based on length of first element. 
list = [3, 1, 2, 3, 4, 1, 2, 3, 4]
       #*          #*

# *number of elements of the sublist    

它的显示比解释更好,上面的结果应该是。

[[1, 2, 3], [1, 2, 3, 4]]

我所处理的列表总是尊重这个逻辑, 第一个元素总是下面n个元素的长度.

EDIT:

根据一些建议,我简单地添加了一个yield,以达到懒惰的目的。

def split(ls):
    """
    func that given a list extracts sub lists with the length indicated by the first element
    [2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4] => [[1, 2], [1, 2, 3], [1, 2, 3, 4]]
    """
    res = []
    while ls:
        dim = ls[0]
        yield ls[1:dim + 1]
        ls = ls[dim + 1:]

    return res

>>> list(split([2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4]))
[[1, 2], [1, 2, 3], [1, 2, 3, 4]]
python list recursion multidimensional-array split
2个回答
5
投票

简单的分片就可以了。

>>> a = [3, 1, 2, 3, 4, 1, 2, 3, 4]
>>> c = []
>>> while len(a) :
...     b = a[0]
...     c.append( a[1:b+1] )
...     a = a[b+1:]
... 
>>> c
[[1, 2, 3], [1, 2, 3, 4]]

2
投票

这里有一个方法可以实现你想要的东西。

numbers = [3, 1, 2, 3, 4, 1, 2, 3, 4]

result = []
def split_list(list_):
    first = list_.pop(0)
    result.append(list_[:first])
    if len(list_[first:]) > 0:
        split_list(list_[first:])

split_list(numbers)

print(result)

2
投票

你可以使用 itertools.islice 在这里。

>>> from itertools import islice
>>> lst = [3, 1, 2, 3, 4, 1, 2, 3, 4]
>>> def chunks(lst):
...     t=iter(lst)
...     c=next(t,None)
...     while c:
...             yield list(islice(t,None,c))
...             c=next(t,None)
...
>>> list(chunks(lst))
[[1, 2, 3], [1, 2, 3, 4]]

-2
投票

我编辑了我的答案,因为受到这个帖子里别人的启发。这不消耗原始数组,使用递归而不是循环。

numbers = [3, 1, 2, 3, 4, 1, 2, 3, 4, 3,1,1,1,1]

def do_take(numbers: []):
    result = []
    to_take = numbers[0]
    result.append(numbers[1:to_take + 1])
    if len(numbers) > to_take:
        result.append(do_take(numbers[to_take + 1:]))
    return result

print(do_take(numbers))
print(numbers)

结果得到如下输出。

# python /tmp/breakup.py
[[1, 2, 3], [[1, 2, 3, 4], [[1, 1, 1], [[]]]]]
[3, 1, 2, 3, 4, 1, 2, 3, 4, 3, 1, 1, 1, 1]
© www.soinside.com 2019 - 2024. All rights reserved.