我需要定义一个函数' 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)。
答案 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)
进行搜索。