递归和随机分组列表

时间:2018-01-20 19:09:51

标签: python python-3.x algorithm list recursion

我试图编写一个创建二分组列表的函数,f。恩。如果我的输入如下:

  

[a,b,c,d,e,f,g,h]

我想选择随机整数,它会一次又一次地将它分成较小的子列表,直到子列表为止。长度最多为两个,如:

  

[[a,[b,c]],[d,[[e,f],[g,h]]]]

这是我迄今为止所得到的,但仍然给了我 TypeError(列表索引必须是整数或切片,而不是列表):

def split_list(l):
    if l.__len__() > 2:
        pivot = np.random.random_integers(0, l.__len__() - 1)
        print(pivot, l)
        l = [RandomTree.split_list(l[:pivot])][RandomTree.split_list(l[pivot:])]
    return l

我被困住了,我会非常感谢任何建议。

2 个答案:

答案 0 :(得分:6)

您的问题并不十分清楚所使用的数据类型,并且似乎使用了一种非传统类型的递归(可能作为类的一部分)。对于错误向下滚动一点。

我冒昧地改变了代码并使用普通的random库,所以你要找的东西看起来像

import random # at the module-declaration part of your program

def split_list (l):
    if len(l) < 2:
        return l
    pivot = random.randint(1, len(l) - 1)
    return [RandomTree.split_list(l[:pivot]) + RandomTree.split_list(l[pivot:])]

我们正在暂停单个元素列表上的递归,并且如果我们还没有停止,则使用随机索引拉出可能的范围来进一步应用递归(注意random.randint生成具有指定的索引边界包括)。

您的错误没有在返回值的两个部分之间使用任何连接运算符。

[A][B]不会连接两个列表,而是尝试将B(在您的情况下)A中给出的列表编入索引,这是一种类型错误的用法。< / p>

因此,您可以使用原始函数(已弃用的numpy随机)作为

def split_list(l):
    if l.__len__() > 2:
        pivot = np.random.random_integers(0, l.__len__() - 1)
        l = [RandomTree.split_list(l[:pivot])] + [RandomTree.split_list(l[pivot:])]
    return l

答案 1 :(得分:2)

根据您的示例,这里的解决方案不会生成单元素列表:

import random

def splitlist(l, minlen=2):
    if len(l) <= minlen:  # if the list is 2 or smaller,
        return l if len(l) > 1 else l[0]  # return the list, or its only element
    x = random.randint(1, len(l)-1)  # choose a random split
    return [splitlist(l[:x], minlen), splitlist(l[x:], minlen)]

用法示例:

>>> splitlist(list(range(8)))
[[0, [1, [2, [3, 4]]]], [[5, 6], 7]]