如何定义以升序返回元组的sort_tuple

时间:2014-03-25 10:39:36

标签: python tuples

我需要定义一个函数' sort_tuple'它接受一个元组并返回一个排序的元组 升序。 (我不应该在代码中使用内置函数sorted或.sort)

注意:代码应该使用insert_tuple函数:

def insert_tup(x, tup):
    b = search(x, tup)
    left = tup[:b]
    right = tup[ b:]
    new_tup = left + (x,) + right
    return new_tup

def search(x, seq):
    for i in seq:
        if x<i:
            return seq.index(i)
        elif x == i:
            return seq.index(i)
        elif x>seq[-1]:
            return (seq.index(seq[-1]))+1

测试结果:

>>> sort_tuple((5, 0, -1, 4, -2))
(-2, -1, 0, 4, 5)

这是我的答案:

def sort_tuple(tup):
    for i in range(len(tup)):
       if tup[i-1] > tup[i]:
            removed_tup = tup[0:i-1] + tup[i: len(tup)]
            new_tup = insert_tup(tup[i-1], removed_tup)
    return new_tup

但是这段代码失败了,因为当我输入这个表达式时:

  

sort_tuple((5,0,-1,4,-2))

输出应按升序排列:( - 2,-1,0,4,5)但输出为(4,5,0,-1,-2)。

1 个答案:

答案 0 :(得分:0)

你应该做一种插入排序:

def sort_tuple(t):
    result = () # start with an empty result
    for val in t:
        result = insert_tup(val, result) # insert each value into its place
    return result

这不是非常有效,但使用您所使用的功能非常容易。

虽然上面的代码非常简单,但在这种情况下,它只能通过侥幸工作,因为search函数在传递空元组时表现不佳(返回None)。幸运的是tup[:None]是一个合法的片段。它出现在特定的情况下,它甚至是正确的!

search的更好实现将始终返回整数。这是一个快速的刺:

def search(x, seq):
    for i, v in enumerate(seq):
        if x < v:
            return i
    return len(seq)

或者更好的是,使用bisect模块在​​O(log n)时间而不是O(n)进行搜索。