16

だから私はそれを印刷すると次のような辞書を持っています:

{'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}

私が定義したカスタムの方法でこれらを並べ替えたいと思います。私がそれを(キーで)ソートしたい方法がであるとしましょうZT21, 10, WX21, UM, 5, 2

事前定義された/カスタムの方法で辞書を分類する方法を知っている人はいますか?私がやっていることは、データベースからこの辞書を取得することです。20を超えるキーがあり、そのすべてに特定の順序があります。順序は常に設定されていますが、特定のキー/値が辞書にない場合があります。したがって、これも発生する可能性があります。

{'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}

(キーで)ソートされますZT21, 10, WX21, UM, 5, 2

したがって、この例には10はありませんが、必要な並べ替えは同じであり、10は存在しません。

何か案は?

4

5 に答える 5

51

Python3.6以降の回答を更新

>>> d = {'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
>>> keyorder = ['ZT21', '10', 'WX21', 'UM', '5', '2']
>>> {k: d[k] for k in keyorder if k in d}
{'ZT21': 14, '10': -10, 'WX21': 12, 'UM': -25, '5': -3, '2': 15}

レガシー回答:Pythonの辞書は順序付けされていません(Python3.6より前)。必要な結果を得ることができますlist

>>> d = {'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
>>> keyorder = ['ZT21', '10', 'WX21', 'UM', '5', '2']
>>> sorted(d.items(), key=lambda i:keyorder.index(i[0]))
[('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)]

またはOrderedDictとして

>>> from collections import OrderedDict
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.index(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])

これらをたくさん行う場合は、キーオーダーにを使用する方が効率的dictです。

>>> keyorder = {k:v for v,k in enumerate(['ZT21', '10', 'WX21', 'UM', '5', '2'])}
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.get(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])
于 2012-08-20T02:45:31.520 に答える
4

OrderedDictを使用し、カスタムオーダーを指定することで並べ替えることができます。

def customsort(dict1 , key_order):
    items = [dict1[k] if k in dict1.keys() else 0 for k in key_order] 
    sorted_dict = OrderedDict()
    for i in range(len(key_order)):
        sorted_dict[key_order[i]] = items[i]
    return sorted_dict
key_order = [ "monday" ,"tuesday" ,"wednesday" ,"thursday" ,"friday" ,"saturday"]
dict1 ={"monday" : 10 , "thursday" :12 , "wednesday" : 34}
sorted_dicti = customsort(dict1,key_order)
print(sorted_dicti)

customsort()は、指定された辞書(dict1)をユーザーから渡されたorder(key_order)でソートします。

items = [dict1[k] if k in dict1.keys() else 0 for k in key_order] 

指定されたキーがdict1にあるかどうかをチェックし、そこにある場合はdict1で指定された値を入力し、そうでない場合は値を0に設定します。

OrderedDict([('monday', 10), ('tuesday', 0), ('wednesday', 34), ('thursday', 12), ('friday', 0), ('saturday', 0)])
于 2018-07-23T05:14:29.860 に答える
2

できません。collections.OrderedDict代わりに使用してください。

于 2012-08-20T01:57:59.947 に答える
1

辞書は本質的に順序付けされていないため、辞書を直接並べ替えることはできません。someDict.items()他のものを並べ替えるときと同じように、キー関数を並べ替えて渡すことで、キーと値のペアを並べ替えることができますが、辞書ではなく、並べ替えられたリストが表示されます。辞書の並べ替えに関する以前の質問を参照してください。Python :リストの辞書の並べ替えやキーの長さによる辞書の並べ替えなど。

于 2012-08-20T01:58:18.983 に答える
0

私はまったく同じ問題を抱えており、軽量の一般的な解決策を考案しました。

from collections import OrderedDict

def make_custom_sort(orders):
    orders = [{k: -i for (i, k) in enumerate(reversed(order), 1)} for order in orders]
    def process(stuff):
        if isinstance(stuff, dict):
            l = [(k, process(v)) for (k, v) in stuff.items()]
            keys = set(stuff)
            for order in orders:
                if keys.issuperset(order):
                    return OrderedDict(sorted(l, key=lambda x: order.get(x[0], 0)))
            return OrderedDict(sorted(l))
        if isinstance(stuff, list):
            return [process(x) for x in stuff]
        return stuff
    return process

まず、カスタムオーダーの並べ替え関数のインスタンスを作成します。

custom_sort = make_custom_sort([ ['ZT21', '10', 'WX21', 'UM', '5', '2'] ])

さて、実際の並べ替え:

result = custom_sort(my_dataset)

欠落しているキーは、最後に不特定の順序で拒否されます。このクロージャは再帰的であることに注意してください。二重括弧で示されているように、構造体にネストされたさまざまなディクショナリが必要とする数のソート順を指定できます。

GitHubのプロジェクト:https ://github.com/laowantong/customsort

于 2014-07-29T20:17:07.173 に答える