0

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

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')
]
4

2 回答 2

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)))

在实践中,列可能不会全部排序,或者可能按左右顺序以外的优先级排序。这可以通过为每个索引附加一个索引并相应地调整算法来解决。

于 2012-08-27T19:36:48.097 回答
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)

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

于 2012-08-27T19:35:39.550 回答