为什么我的列表是Nonetype?在python中

时间:2013-11-06 17:41:45

标签: python python-3.x

我不明白为什么我的列表在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

谢谢!

4 个答案:

答案 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]