Oracle SQLには、次のように注文する機能があります。
order by decode("carrot" = 2
,"banana" = 1
,"apple" = 3)
Pythonでこれを実装するための最良の方法は何ですか?
キーでdictを注文できるようにしたいと思います。そして、その順序は必ずしもアルファベット順ではありません-私は順序を決定します。
Oracle SQLには、次のように注文する機能があります。
order by decode("carrot" = 2
,"banana" = 1
,"apple" = 3)
Pythonでこれを実装するための最良の方法は何ですか?
キーでdictを注文できるようにしたいと思います。そして、その順序は必ずしもアルファベット順ではありません-私は順序を決定します。
のkey
名前付きキーワード引数を使用しますsorted()
。
#set up the order you want the keys to appear here
order = ["banana", "carrot", "apple"]
# this uses the order list to sort the actual keys.
sorted(keys, key=order.index)
よりも高いパフォーマンスlist.index
を得るには、代わりに を使用できますdict.get
。
#this builds a dictionary to lookup the desired ordering
order = dict((key, idx) for idx, key in enumerate(["banana", "carrot", "apple"]))
# this uses the order dict to sort the actual keys.
sorted(keys, key=order.get)
dict 自体を並べ替えることはできませんが、それを (キー、値) タプルのリストに変換し、それを並べ替えることができます。
そのためには .items() メソッドを使用します。例えば、
>>> {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
>>> {'a': 1, 'b': 2}.items()
[('a', 1), ('b', 2)]
これをソートする最も効率的な方法は、キー関数を使用することです。cmp を使用すると、アイテムのペアごとに呼び出す必要があるため、効率が低下します。key を使用すると、アイテムごとに 1 回だけ呼び出す必要があります。ソート方法に従ってアイテムを変換する callable を指定するだけです。
sorted(somedict.items(), key=lambda x: {'carrot': 2, 'banana': 1, 'apple':3}[x[0]])
上記は、必要なキーのカスタム順序を指定する dict を定義し、ラムダは古い dict の各キーに対してその値を返します。
Python の dict はハッシュマップなので、順序はありません。ただし、 keys()メソッドを使用して辞書からキーを抽出して、キーを個別に並べ替えることができます。
sorted()
比較関数とキー関数を引数として取ります。
でデコードの正確なコピーを行うことができます
sortedKeys = sorted(dictionary, {"carrot": 2
,"banana": 1
,"apple": 3}.get);
辞書を並べ替えることはできません。辞書はマッピングであり、マッピングには順序がありません。
ただし、キーを抽出して並べ替えることができます。
keys = myDict.keys()
sorted_keys = sorted(keys, myCompare)
OrderedDict
新しい Python バージョンがあります: http://www.python.org/dev/peps/pep-0372/。
その間、別の実装の 1 つを試すことができます: http://code.activestate.com/recipes/496761/、Ordered Dictionary。
dict は順序付けされていません。キーのリストを保持する必要があります。
独自の比較関数を list.sort() または sorted() に渡すことができます。
複数のキーでソートする必要がある場合は、それらをタプルに連結し、タプルでソートします。