我有一个多列数据表,每一行都是唯一的,我想知道如何根据多个列对其进行排序。如果按字母顺序排序,则已经描述了解决方案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')
]
答案 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)))
实际上,列可能不会全部排序,也可能按照左右顺序排列。这可以通过为每个索引附加索引并相应地调整算法来解决。