我不明白为什么我的列表在Nonetype中。我试图构建一个接收int列表的函数,其中第一个索引是pivot,然后对列表的其余部分进行排序,因此每个大于pivot的int将在右侧,而int则小于枢轴将在左侧。 int不需要从最小到最大排序。 这是我的代码:
def divide_list(lst):
pivot = lst[0]
lst= lst.reverse()
for i in lst:
if i>pivot:
lst.append(i)
lst.remove(i)
return lst
谢谢!
答案 0 :(得分:2)
lst.reverse()
撤消列表到位并返回None
。不要将返回值分配回lst
:
def divide_list(lst):
pivot = lst[0]
lst.reverse()
for i in lst:
if i>pivot:
lst.append(i)
lst.remove(i)
return lst
如果您不希望就地更改lst
,请使用否定切片以相反的顺序获取列表的新副本:
def divide_list(lst):
pivot = lst[0]
lst = lst[::-1]
for i in lst:
if i>pivot:
lst.append(i)
lst.remove(i)
return lst
这仍然会导致各种问题;当您在for
循环中就地更改列表时,您的方法将无法正常工作。在向列表中添加和删除元素时,迭代器会不更新,列表行为将不符合您的预期。
假设您在撤消后有一个列表[3, 4, 1, 2]
,其中枢轴为2
。在循环中,for
循环使用的迭代器查看lst[0]
,并通过追加和删除将3
移动到列表的末尾。现在,列表看起来像[4, 1, 2, 3]
,循环前进到lst[1]
,因此到1
值。已完全跳过4
!
答案 1 :(得分:1)
修改你正在迭代的列表是一个坏主意;较大的输入列表也会变慢。最好使用新列表来构建结果。
def divide_list(lst):
ret = [] # might replace with collections.deque
# for better performance with larger inputs
pivot = lst[0]
for i in reversed(lst):
if i > pivot:
ret.append(i)
else:
ret.insert(0, i)
return ret
此外,您可以使用2个单独的列表,然后将它们作为元组返回,或者在最后将它们连接起来:
def divide_list(lst):
left, right = [], []
pivot = lst[0]
for i in reversed(lst):
(right if i > pivot else left).append(i)
return left + right # or (left, right)
或者您甚至可以在列表上进行2次迭代,但通过使用生成器来避免代价高昂的append
或连接操作:
def divide_list(lst):
pivot = lst[0]
for i in reversed(lst):
if i < pivot: yield i
for i in reversed(lst):
if i >= pivot: yield i
new_list = list(divide_list(orig_list))
答案 2 :(得分:0)
看起来你正在实施快速排序。如果是这种情况,我可能会这样做:
def divide_list(lst):
pivot = lst[0]
left = []
right = []
for item in lst:
if item > pivot:
right.append(item)
else:
left.append(item)
return left, right
当然,如果你想要最后一个列表,你可以做一些有趣的事情,如:
return left[::-1] + right
向左反转,然后用右边连接。
答案 3 :(得分:0)
其他人已经为您提供了解决问题的解释,但也许您会考虑更直接的实施?
def divide_list(lst):
pivot = lst[0]
return [i for i in lst if i <= pivot] + [i for i in lst if i > pivot]