在Python中混淆返回语句

时间:2016-05-05 15:29:33

标签: python sorting python-3.x recursion

我无法理解为什么return语句没有返回排序值?

我正在尝试对列表进行排序(不包含重复的数字),我试图将最小的数字推到左边,最大的数字推到右边,发布中间的列表是分割的再次调用相同的函数。

def max_sort(i):
    if i == []:
        return []
    else:
        [min_val, max_val] = [min(i), max(i)]
        min_pos = i.index(min(i))
        max_pos = i.index(max(i))
        '''for sorting in ascending order only, min val moves to left, max val moves to right'''
        if min_pos == 0 and max_pos == len(i) - 1:
            i = i[1:-1]
            return [min_val] + [max_sort(i)] + [max_val]
        elif min_pos == 0:
            i = i[1:]
            return [min_val] + max_sort(i)
        elif max_pos == len(i) - 1:
            i = i[:-1]
            return [max_sort(i)] + [max_val]
        else:
            min_pos_copy = min_pos
            for x in range(0, min_pos_copy):
                i[min_pos] = i[min_pos - 1]
                i[min_pos - 1] = min_val
                min_pos = i.index(min(i))
            max_pos = i.index(max(i))
            max_pos_copy = max_pos
            for y in range(max_pos_copy, len(i)-1):
                i[max_pos] = i[max_pos + 1]
                i[max_pos + 1] = max_val
                max_pos = i.index(max(i))
            max_sort(i)

max_sort([22, 876, 4, 101, 7, 0])

它会降低到拆分正确序列的水平,但不会将其SPLICE备份。为什么?

1 个答案:

答案 0 :(得分:1)

代码中有两个问题。首先,因为max_sort应该返回list,所以您不需要将返回值分配给新列表。因此,只需使用return [max_sort(i)] + [max_val]而不是return max_sort(i) + [max_val]。您的代码中有几个这样的情况。

另一个问题是else分支没有返回任何内容。通过将函数中的最后一行更改为return max_sort(i),可以轻松解决此问题。通过这些更改,您的代码应该按预期工作。