2009-03-23 9 views
3

によって任意の順序は次のように注文する機能があり、SQL:のpython:オラクルで

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

pythonでこれを実装するための最良の方法だろうか?

私は、そのキーにdictを注文できるようにします。その注文はアルファベット順でも何でもないので、私は注文を決めます。

+0

辞書は実際に注文されていないので、辞書を注文するとどういう意味ですか? –

答えて

4

dict自体は注文できませんが、それを(キー、値)タプルのリストに変換することができ、それを並べ替えることができます。

これを行うには、.items()メソッドを使用します。たとえば、

>>> {'a': 1, 'b': 2} 
{'a': 1, 'b': 2} 
>>> {'a': 1, 'b': 2}.items() 
[('a', 1), ('b', 2)] 

最も効率的な方法は、キー機能を使用することです。 cmpを使用すると効率的ではありません。なぜなら、キーを使用するとアイテムごとに呼び出される必要があるアイテムのペアごとにコールする必要があるからです。ただ、それはソート方法に応じてアイテムを変換します呼び出し可能に指定します。

sorted(somedict.items(), key=lambda x: {'carrot': 2, 'banana': 1, 'apple':3}[x[0]]) 

を上記したいキーのカスタムオーダーを指定する辞書を定義し、ラムダは、各キーのためにその値を返します。古い言葉で

+0

cmpはバブルソートを強制しませんが、速度は遅くなります。 – recursive

+1

「バブルソートを強制する」?本当に?私はそれが信じがたいことがわかります。 –

1

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

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

あなたは辞書を並べ替えることはできません

sortedKeys = sorted(dictionary, {"carrot": 2 
           ,"banana": 1 
           ,"apple": 3}.get); 
+0

ソートされません(辞書、ラムダなど...)だけでなく動作しますか?私は明示的にキーを抽出する必要はないと思っています、ソートはあなたのためにこれを行いますか? –

+0

いいえ言いましたように、辞書には順序がありません。 dictionary.keys()はリストなので、注文することができます。 – vartec

+0

-1:ラムダまで正解。そして、それほどうれしくない。 –

1

であなたのデコードの正確なコピーを行うことができます。ディクショナリはマッピングであり、マッピングには順序付けはありません。

ただし、キーを抽出し、それらを並べ替えることができます:

keys = myDict.keys() 
sorted_keys = sorted(keys, myCompare) 
0

辞書を注文されていません。キーのリストを保持する必要があります。

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

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

14

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

+1: 'cmp'引数がPython 3.0で削除され、比較関数がひどく遅くなっています。このようなキー引数を使用すると、実際に進めるのが最良の方法です。 –

+0

かなり優雅です。私はすきです。 – SpoonMeiser