运行函数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]]]]]]]]]
答案 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:])
。