多列表排序,每列都有自定义排序

时间:2012-08-27 19:29:59

标签: python

我有一个多列数据表,每一行都是唯一的,我想知道如何根据多个列对其进行排序。如果按字母顺序排序,则已经描述了解决方案here。但是,我需要根据存储在另一个列表中的自定义顺序对每列进行排序,而不是按字母顺序排序。例如,如果我的表是

mytable = [
    ('A1', 'B1', 'C1'),
    ('A1', 'B2', 'C2'),
    ('A2', 'B2', 'C1'),
    ('A2', 'B2', 'C2')
]

我可能希望第一列被排序['A2','A1'],第二列要排序['B1','B2'],第三列要排序['C2', 'C1']。正确的结果将是

mytable = [
    ('A2', 'B2', 'C2'),
    ('A2', 'B2', 'C1'),
    ('A1', 'B1', 'C1'),
    ('A1', 'B2', 'C2')
]

2 个答案:

答案 0 :(得分:1)

Python默认按字典顺序排序元组。这意味着您需要做的就是编写一个能够再次返回元组的键函数。示例代码:

order_a = {"A1": 1, "A2": 0}
order_b = {"B1": 0, "B2": 1}
order_c = {"C1": 1, "C2": 0}

def key(t):
    return order_a[t[0]], order_b[t[1]], order_c[t[2]]

mytable.sort(key=key)

(我使用词典而不是列表来定义这里的顺序,因为这会为大量可能的值带来更好的性能。)

答案 1 :(得分:1)

这将满足您的需求:

orderings = (
    ('A2', 'A1'),
    ('B1', 'B2'),
    ('C2', 'C1')
)

orders = [dict([(v, i) for i, v in enumerate(o)]) for o in orderings]

mytable.sort(key=lambda r: tuple(o[c] for c, o in zip(r, orders)))

实际上,列可能不会全部排序,也可能按照左右顺序排列。这可以通过为每个索引附加索引并相应地调整算法来解决。