【问题标题】:Pythonic way to reverse search a nested dictionary反向搜索嵌套字典的 Pythonic 方法
【发布时间】:2018-03-09 14:07:56
【问题描述】:

我已经有一个工作代码,但我想改进它(如果有更好的方法)。

以下是此代码正在处理的数据结构示例:

{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'}}}

如您所见,数据结构非常规则。我正在编写一个可以找到一个 KEY 的代码,它与 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

【问题讨论】:

    标签: python dictionary search nested


    【解决方案1】:

    如果您真的想要单线,可以使用以下方法:

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

    【讨论】:

    • 谢谢你提供有用的线索,现在我明白了,诀窍是value['ordertxid'] = MATCH。我将展示我的最终实现作为其他人的答案。
    【解决方案2】:

    我实现的最终代码如下(与简单平面字典的代码风格相同,如上所示),它包含解决嵌套字典反向搜索的单行代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多