有没有一个简单的方法来判断一个值是否存在于一个复杂的字典中?

2024-10-01 00:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个复杂的字典,我循环通过的例子。我想检查字典里是否出现“AccountRoot”。请注意,我正在循环浏览这些词典中的许多,并且格式发生了变化。因此我想知道是否有像.find()这样的函数。我找不到,而且好像.find()不起作用。你知道吗

例句

{'hash': '752F3B5CEE85F3C2DC60041DCAC4777BECE9CC11585225383F8178EBC2ACFB16',
 'ledger_index': 108843,
 'date': '2013-01-18T22:27:20+00:00',
 'tx': {'TransactionType': 'OfferCreate',
  'Flags': 0,
  'Sequence': 3,
  'TakerPays': '499950000',
  'TakerGets': {'value': '0.05',
   'currency': 'BTC',
   'issuer': 'r4aZ4aqXHfrcYfuFrTqDmSopfgPHnRS9MZ'},
  'Fee': '10',
  'SigningPubKey': '027008A4A7AED7B5426EAC46691CFCAC8CA3CF2773D1CAC4074F0BC58EC24BE883',
  'TxnSignature': '3046022100C38236B533936B4A328346D5246570976B8A1390655EC1B6F4090C42AE73FD8D022100D49E5498C40D90AF7BD02F2818EE04F1D0F6B0C76F0325997190D56BF4B9D82D',
  'Account': 'r4aZ4aqXHfrcYfuFrTqDmSopfgPHnRS9MZ'},
 'meta': {'TransactionIndex': 0,
  'AffectedNodes': [{'CreatedNode': {'LedgerEntryType': 'DirectoryNode',
     'LedgerIndex': '0A624575D3C02D544B92F23F6A8BDF3B10745427B731613820A1695AFF11993B',
     'NewFields': {'ExchangeRate': '5E2386099B1BF000',
      'RootIndex': '0A624575D3C02D544B92F23F6A8BDF3B10745427B731613820A1695AFF11993B',
      'TakerGetsCurrency': '0000000000000000000000004254430000000000',
      'TakerGetsIssuer': 'E767BCB9E1A31C46C16F42DA9DDE55792767F565'}}},
   {'CreatedNode': {'LedgerEntryType': 'DirectoryNode',
     'LedgerIndex': '165845E192D2217A6518C313F3F4B2FD676EE1619FF50CB85E2386099B1BF000',
     'NewFields': {'ExchangeRate': '5E2386099B1BF000',
      'RootIndex': '165845E192D2217A6518C313F3F4B2FD676EE1619FF50CB85E2386099B1BF000',
      'TakerGetsCurrency': '0000000000000000000000004254430000000000',
      'TakerGetsIssuer': 'E767BCB9E1A31C46C16F42DA9DDE55792767F565'}}},
   {'ModifiedNode': {'LedgerEntryType': 'AccountRoot',
     'PreviousTxnLgrSeq': 108839,
     'PreviousTxnID': '8B2921C5222A6814BCF7602A18FEACE94797A644AF893A43FB642C172CC14ED0',
     'LedgerIndex': '481DA662E465CC7888FD3750A0952F2003D78DCAA8CB2E91088E862BB7D30B98',
     'PreviousFields': {'Sequence': 3,
      'OwnerCount': 0,
      'Balance': '9999999980'},
     'FinalFields': {'Flags': 0,
      'Sequence': 4,
      'OwnerCount': 1,
      'Balance': '9999999970',
      'Account': 'r4aZ4aqXHfrcYfuFrTqDmSopfgPHnRS9MZ'}}},
   {'CreatedNode': {'LedgerEntryType': 'Offer',
     'LedgerIndex': '9AABB5DCD201AE7FB0F9B7F90083F48B7451977B2419339ADFEBD8876B54EB66',
     'NewFields': {'Sequence': 3,
      'BookDirectory': '165845E192D2217A6518C313F3F4B2FD676EE1619FF50CB85E2386099B1BF000',
      'TakerPays': '499950000',
      'TakerGets': {'value': '0.05',
       'currency': 'BTC',
       'issuer': 'r4aZ4aqXHfrcYfuFrTqDmSopfgPHnRS9MZ'},
      'Account': 'r4aZ4aqXHfrcYfuFrTqDmSopfgPHnRS9MZ'}}}],
  'TransactionResult': 'tesSUCCESS'}}

Tags: 字典valueaccountfindcurrencyflagssequencecreatednode
2条回答

可能有一个更简单的方法,但我是这样做的。我已经为你的用例修改了它。你知道吗

import copy

def traverse_dict(_obj):
    _obj_2 = copy.deepcopy(_obj)
    if isinstance(_obj_2, dict):
        for key, value in _obj_2.items():
            if key == 'your_value':
                do_your_stuff()
            _obj_2[key] = traverse_dict(value)
    elif isinstance(_obj, list):
        for offset in range(len(_obj_2)):
            _obj_2[offset] = traverse_dict(_obj_2[offset])
    return _obj_2

回答如下: Finding a key recursively in a dictionary

张贴这一点,以便人们可以遇到的答案,如果他们搜索使用不同的术语。你知道吗

我将使用alecxe的答案,使用Gareth Rees在这里定义的迭代器堆栈模式:http://garethrees.org/2016/09/28/pattern/

其他链接被破坏时的代码:

def search(d, key, default=None):
    """
    Return a value corresponding to the specified key in the (possibly
    nested) dictionary d. If there is no item with that key, return
    default.
    """
    stack = [iter(d.items())]
    while stack:
        for k, v in stack[-1]:
            if isinstance(v, dict):
                stack.append(iter(v.items()))
                break
            elif k == key:
                return v
        else:
            stack.pop()
    return default

此代码允许您避免超出某些其他解决方案中存在的最大递归深度的问题。你知道吗

编辑:意识到你只是想找出字典中是否存在一个值。你知道吗

您可以简单地将for循环修改为这样的内容,它应该可以用于简单的真/假搜索。你知道吗

def search(d, key, default=False):
    """
    Return a value corresponding to the specified key in the (possibly
    nested) dictionary d. If there is no item with that key, return
    default.
    """
    stack = [iter(d.items())]
    while stack:
        for k, v in stack[-1]:
            if isinstance(v, dict):
                stack.append(iter(v.items()))
                break
            elif k == key:
                return True
            elif v == key:
                return True
        else:
            stack.pop()
    return default

相关问题 更多 >