簡體   English   中英

反向搜索嵌套字典的Python方法

[英]Pythonic way to reverse search a nested dictionary

我已經有一個有效的代碼,但是我想對其進行改進(如果有更好的方法)。

這是此代碼正在處理的數據結構的示例:

{u'error': [],
 u'result': {u'T2JJER-DDEER-A3C45R': {u'cost': u'101.48810',
                                      u'fee': u'0.27402',
                                      u'margin': u'50.74405',
                                      u'misc': u'',
                                      u'oflags': u'',
                                      u'ordertxid': u'O5HCKM-QMBW5-6F4UAB',
                                      u'ordertype': u'limit',
                                      u'pair': u'XXBTZEUR',
                                      u'posstatus': u'open',
                                      u'rollovertm': u'1519410923',
                                      u'terms': u'0.0100% per 4 hours',
                                      u'time': 1519396523.8057,
                                      u'type': u'buy',
                                      u'vol': u'0.10050000',
                                      u'vol_closed': u'0.00000000'},
             u'T4KPEJ-TKDDR-ZOP45C': {u'cost': u'101.38560',
                                      u'fee': u'0.27374',
                                      u'margin': u'50.69280',
                                      u'misc': u'',
                                      u'oflags': u'',
                                      u'ordertxid': u'OU5NOD-L4KLX-AZINT7',
                                      u'ordertype': u'limit',
                                      u'pair': u'XXBTZEUR',
                                      u'posstatus': u'open',
                                      u'rollovertm': u'1519410923',
                                      u'terms': u'0.0100% per 4 hours',
                                      u'time': 1519396523.8057,
                                      u'type': u'buy',
                                      u'vol': u'0.10050000',
                                      u'vol_closed': u'0.00000000'},
             u'TWJP3K-ASTDW-CO7P3Z': {u'cost': u'101.23520',
                                      u'fee': u'0.27333',
                                      u'margin': u'50.61760',
                                      u'misc': u'',
                                      u'oflags': u'',
                                      u'ordertxid': u'OUKPLC-IZTVW-ZMMFZH',
                                      u'ordertype': u'limit',
                                      u'pair': u'XXBTZEUR',
                                      u'posstatus': u'open',
                                      u'rollovertm': u'1519410923',
                                      u'terms': u'0.0100% per 4 hours',
                                      u'time': 1519396523.8057,
                                      u'type': u'buy',
                                      u'vol': u'0.10050000',
                                      u'vol_closed': u'0.00000000'}}}

如您所見,數據結構非常規則。 我正在編寫一個代碼,該代碼可以找到一個與APIresponse['result'][KEY]['ordertxid']的給定值匹配的APIresponse['result'][KEY]['ordertxid']

這是我想出的代碼(它包含數據結構,要運行它,只需將粘貼復制到python控制台中即可):

def search_dict(DC, MATCH):
    for KEY in DC:
        #print (KEY, DC[KEY]['ordertxid'])
        if DC[KEY]['ordertxid'] == MATCH: return KEY

APIresponse = {u'result': {u'T4KPEJ-TKDDR-ZOP45C': {u'cost': u'101.38560', u'fee': u'0.27374', u'margin': u'50.69280', u'misc': u'', u'oflags': u'', u'ordertxid': u'OU5NOD-L4KLX-AZINT7', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'},
                           u'T2JJER-DDEER-A3C45R': {u'cost': u'101.48810', u'fee': u'0.27402', u'margin': u'50.74405', u'misc': u'', u'oflags': u'', u'ordertxid': u'O5HCKM-QMBW5-6F4UAB', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'},
                           u'TWJP3K-ASTDW-CO7P3Z': {u'cost': u'101.23520', u'fee': u'0.27333', u'margin': u'50.61760', u'misc': u'', u'oflags': u'', u'ordertxid': u'OUKPLC-IZTVW-ZMMFZH', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'}}, u'error': []}

print "Matching key is: %s" % search_dict(APIresponse['result'], "OU5NOD-L4KLX-AZINT7")

問題:有沒有沒有for循環的方法來編寫search_dict子例程? 優選地是單缸套。

順便說一句,我確實在網絡和論壇上搜索了合適的解決方案。 我找到了一個簡單的平面字典的解決方案,但是我不知道如何將其擴展為嵌套字典。

這種單行代碼適用於簡單的平面詞典:

APIresponse = {u'result': {u'T4KPEJ-TKDDR-ZOP45C': u'OU5NOD-L4KLX-AZINT7',
                           u'T2JJER-DDEER-A3C45R': u'O5HCKM-QMBW5-6F4UAB',
                           u'TWJP3K-ASTDW-CO7P3Z': u'OUKPLC-IZTVW-ZMMFZH'}, u'error': []}
ORDERid = 'O5HCKM-QMBW5-6F4UAB'

TRADEid = [key for key, value in APIresponse['result'].items() if value == ORDERid]
print TRADEid

如果您真的想要單線,則可以執行以下操作:

next((k for k, v in DC.items() if v['ordertxid'] == MATCH), None)

我實現的最終代碼如下(與簡單的平面字典的代碼相同,如上所示),它包含一個單行代碼,用於解決嵌套字典的反向搜索:

APIresponse = {u'result': {u'T4KPEJ-TKDDR-ZOP45C': {u'cost': u'101.38560', u'fee': u'0.27374', u'margin': u'50.69280', u'misc': u'', u'oflags': u'', u'ordertxid': u'OU5NOD-L4KLX-AZINT7', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'},
                           u'T2JJER-DDEER-A3C45R': {u'cost': u'101.48810', u'fee': u'0.27402', u'margin': u'50.74405', u'misc': u'', u'oflags': u'', u'ordertxid': u'O5HCKM-QMBW5-6F4UAB', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'},
                           u'TWJP3K-ASTDW-CO7P3Z': {u'cost': u'101.23520', u'fee': u'0.27333', u'margin': u'50.61760', u'misc': u'', u'oflags': u'', u'ordertxid': u'OUKPLC-IZTVW-ZMMFZH', u'ordertype': u'limit', u'pair': u'XXBTZEUR', u'posstatus': u'open', u'rollovertm': u'1519410923', u'terms': u'0.0100% per 4 hours', u'time': 1519396523.8057, u'type': u'buy', u'vol': u'0.10050000', u'vol_closed': u'0.00000000'}}, u'error': []}
ORDERid = 'O5HCKM-QMBW5-6F4UAB'

TRADEid = [key for key, value in APIresponse['result'].items() if value['ordertxid'] == ORDERid]
print TRADEid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM