ss = [(0,'bb','jj'), (1,'aa','mm'), (2,'aa','kk'),(3,'bb','ee'),(4,'gg','ff')]
for x in ss:
pp = <somthing>
使用Python,是否可以从ss插入pp并维护按两个属性排序的pp,让我们说 第二个然后是第三个位置,以便得到以下结果(两个属性都在升序):
pp = [(2, 'aa', 'kk'), (1, 'aa', 'mm'), (3, 'bb', 'ee'), (0, 'bb', 'jj'), (4, 'gg', 'ff')]
或(两个属性都在下降):
pp = [(4, 'gg', 'ff'), (0, 'bb', 'jj'), (3, 'bb', 'ee'), (1, 'aa', 'mm'), (2, 'aa', 'kk')]
我不想在已完成工作的循环之后使用以下两个语句:
pp = sorted(ss, key = operator.itemgetter(1, 2))
pp = sorted(ss, key = operator.itemgetter(1, 2), reverse=True)
因为我正在处理一个很长的列表,并且我已经有了我想要重复用于排序的循环。
答案 0 :(得分:2)
您可以在每次插入时使用二进制搜索。
ss = [(0,'bb','jj'), (1,'aa','mm'), (2,'aa','kk'),(3,'bb','ee'),(4,'gg','ff')]
l = []
def insert_sort(l, e, compare):
lo = 0
hi = len(l)
while lo < hi:
mid = (lo+hi) / 2
if compare(e, l[mid]):
lo = mid + 1
else:
hi = mid
l.insert(lo, e)
ascend_list = []
descend_list = []
for i in ss:
insert_sort(ascend_list, i, lambda x, y: x[1:] >= y[1:])
for i in ss:
insert_sort(descend_list, i, lambda x, y: x[1:] < y[1:])
print ascend_list
print descend_list