python - 维护按多个属性排序的列表?

标签 python list sorting attributes

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 按两个属性排序,比方说按 第 2 个然后第 3 个位置以获得以下结果(两个属性都升序):

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)

因为我正在处理一个很长的列表,而且我已经有了循环,我也想重用它来进行排序。

最佳答案

您可以在每次插入时使用二进制搜索。

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

关于python - 维护按多个属性排序的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335289/

相关文章:

r - 将嵌套列表中的元素转换为数据框

python - 一起遍历列表的列表和列表

python - Numpy 逐元素标准差

python - 如何在 Kivy-iOS 上修改屏幕分辨率

python - pygraphviz,导入错误 : undefined symbol: Agundirected

Python 将文本中的 ""替换为\"

python - 有没有使用元素树从 xml 文件创建多个数据框的方法?

python - 按格式化为字符串的键对 python 字典进行排序

python - 添加列并选择总和最大的列

c# - 如果多次使用,是否应该评估从 OrderBy 返回的 IEnumerable?