5

Oracle SQLには、次のように注文する機能があります。

order by decode("carrot" = 2
               ,"banana" = 1
               ,"apple" = 3)

Pythonでこれを実装するための最良の方法は何ですか?

キーでdictを注文できるようにしたいと思います。そして、その順序は必ずしもアルファベット順ではありません-私は順序を決定します。

4

6 に答える 6

16

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)
于 2009-03-23T15:40:10.100 に答える
4

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 の各キーに対してその値を返します。

于 2009-03-23T15:47:08.880 に答える
1

Python の dict はハッシュマップなので、順序はありません。ただし、 keys()メソッドを使用して辞書からキーを抽出して、キーを個別に並べ替えることができます。

sorted()比較関数とキー関数を引数として取ります。

でデコードの正確なコピーを行うことができます

sortedKeys = sorted(dictionary, {"carrot": 2
                                ,"banana": 1
                                ,"apple":  3}.get);
于 2009-03-23T15:37:47.780 に答える
1

辞書を並べ替えることはできません。辞書はマッピングであり、マッピングには順序がありません。

ただし、キーを抽出して並べ替えることができます。

keys = myDict.keys()
sorted_keys = sorted(keys, myCompare)
于 2009-03-23T15:39:42.330 に答える
1

OrderedDict新しい Python バージョンがあります: http://www.python.org/dev/peps/pep-0372/

その間、別の実装の 1 つを試すことができます: http://code.activestate.com/recipes/496761/Ordered Dictionary

于 2009-03-23T15:41:25.040 に答える
0

dict は順序付けされていません。キーのリストを保持する必要があります。

独自の比較関数を list.sort() または sorted() に渡すことができます。

複数のキーでソートする必要がある場合は、それらをタプルに連結し、タプルでソートします。

于 2009-03-23T15:39:58.227 に答える