0

データの複数列のテーブルがあり、各行が一意であり、複数の列に基づいて並べ替える方法を知りたいです。アルファベット順に並べ替える場合、解決策はすでにここで説明されています。ただし、アルファベット順に並べ替える代わりに、別のリストに保存されているカスタムの順序に基づいて各列を並べ替える必要があります。たとえば、私のテーブルが

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

最初の列を['A2'、'A1']、2番目の列を['B1'、'B2']、3番目の列を['C2'、'C1']に並べ替えたい場合があります。 ]。適切な結果は次のようになります

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

2 に答える 2

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 に答える
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 に答える