簡體   English   中英

在Python中遞歸遍歷字典?

[英]Traverse a dictionary recursively in Python?

遞歸遍歷字典的更好方法是什么? 我可以用 lambda 或/和列表理解來做嗎?

我有:

[
  {
    "id": 1,
    "children": [
      {
        "id": 2,
        "children": []
      }
    ]
  },
  {
    "id": 3,
    "children": []
  },
  {
    "id": 4,
    "children": [
      {
        "id": 5,
        "children": [
          {
            "id": 6,
            "children": [
              {
                "id": 7,
                "children": []
              }
            ]
          }
        ]
      }
    ]
  }
]

我想:

[1,2,3,4,5,6,7]

最簡單的方法是使用遞歸函數:

recursive_function = lambda x: [x['id']] + [item for child in x['children'] for item in recursive_function(child)]
result = [item for topnode in whatever_your_list_is_called for item in recursive_function(topnode)]

您可以使用此通用生成器函數遞歸遍歷字典,如下所示

def rec(current_object):
    if isinstance(current_object, dict):
        yield current_object["id"]
        for item in rec(current_object["children"]):
            yield item
    elif isinstance(current_object, list):
        for items in current_object:
            for item in rec(items):
                yield item

print list(rec(data))
# [1, 2, 3, 4, 5, 6, 7]

我的解決方案:

results = []
def function(lst):
    for item in lst:
        results.append(item.get('id'))
        function(item.get('children'))
function(l)
print results

[1、2、3、4、5、6、7]

dicter庫可能很有用。 您可以輕松展平或遍歷字典路徑。

pip install dicter

import dicter as dt

# Example dict:
d = {'level_a': 1, 'level_b': {'a': 'hello world'}, 'level_c': 3, 'level_d': {'a': 1, 'b': 2, 'c': {'e': 10}}, 'level_e': 2}

# Walk through dict to get all paths
paths = dt.path(d)

print(paths)
# [[['level_a'], 1],
# [['level_c'],  3],
# [['level_e'], 2],
# [['level_b', 'a'], 'hello world'],
# [['level_d', 'a'], 1],
# [['level_d', 'b'], 2],
# [['level_d', 'c', 'e'], 10]]

第一列是關鍵路徑。 第二列是值。 在您的情況下,您可以在第一列中獲取所有最后的元素。

暫無
暫無

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

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