我需要定义一个函数'sort_tuple‘,它接受元组并返回按升序排序的元组。(我不应该在代码中使用内置函数排序或.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)。
发布于 2014-03-25 12:11:15
您可能应该做一种插入排序:
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)中进行搜索。
https://stackoverflow.com/questions/22631987
复制相似问题