递归导致嵌套列表

时间:2019-09-04 23:19:25

标签: python python-3.x recursion

运行函数frisbeeSort()总是会导致列表被排序,但每个项目都位于嵌套列表中。我想递归地更改原始列表,而不是使用临时列表。

def frisbeeSort(n):
    index = n.index(min(n))
    if len(n) == 1:
        return n[0]
    else:
        n[0:index + 1] = n[index::-1]
        n = [n[0], frisbeeSort(n[1:])]
    return n

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]

我希望

[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]

但我不断得到

[1, [12, [12, [13, [34, [42, [45, [76, [98, 234]]]]]]]]]

3 个答案:

答案 0 :(得分:2)

len(n) == 1时,您返回一个项目,而不是列表。您还错误地串联了两个列表。试试这个:

def frisbeeSort(n):
    index = n.index(min(n))
    if len(n) == 1:
        return [n[0]]
    else:
        n[0:index + 1] = n[index::-1]
        n = [n[0]] + frisbeeSort(n[1:])
    return n

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
print(frisbeeSort(list1))

输出:

[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]

答案 1 :(得分:2)

  

我想递归地更改原始列表,而不是使用   临时列表

尽管接受的答案解决了“嵌套列表”问题,但我认为它不能满足上述期望。也就是说,如果您这样做:

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
print(frisbeeSort(list1))
print(list1)

您得到:

> python3 test.py
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
[1, 234, 98, 13, 45, 76, 12, 34, 42, 12]
>

list1被更改但未排序的位置。这是解决使用OP算法对列表进行即时排序的一种方法:

def frisbeeSort(n, start=0):
    if start < len(n):
        index = n.index(min(n[start:]), start)
        n[start:index + 1] = n[start:index + 1][::-1]
        frisbeeSort(n, start + 1)

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
frisbeeSort(list1)
print(list1)

输出

> python3 test.py
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
>
  

能否请您解释一下原始列表的确切变化   而不是返回排序列表?

有两件事可以使这种情况发生。首先,(默认)第二个start参数:

def frisbeeSort(n, start=0):

这使我们可以保留在递归调用中排序的初始元素:

 frisbeeSort(n, start + 1)

并告诉我们从哪里开始新的最小搜索:

 index = n.index(min(n[start:]), start)

等其次,将赋值放回数组本身:

n[start:index + 1] = n[start:index + 1][::-1]

我们将剩余的未排序元素替换为相同的相反值。右侧的临时阵列会被扔,原始阵列会被更新。

答案 2 :(得分:0)

在编写[n[0], frisbeeSort(n[1:])]时,它将创建一个包含两个元素的列表,其中第一个元素是n[0],第二个元素是从frisbeeSort(n[1:])返回的值(这是一个列表) 。如果要将它们加入平面列表,可以编写[n[0]] + frisbeeSort(n[1:])