鑒于這種資料結構
[{'name': 'Business Operations',
'team_edit': ['BusinessOperations'],
'team_view': ['Snaptest'],
'test_sub_subfolder': [
{'name': 'test_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}],
'test_sub2_subfolder': [
{'name': 'test_sub2',
'test_sub_subfolder': [
{'name': 'test_sub_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}]}]}]
我正在嘗試撰寫一個遞回函式,它可以讓我訪問所有元素,基本上是將它們列印出來。嵌套結構可以是任意長度,但始終遵循這種格式。
我的第一次嘗試是
def recurse_over_object(dict_obj):
for key, value in dict_obj.items():
if 'subfolder' in key:
for pair in recurse_over_object(value[0]):
print(key, *pair)
# yield (key, *pair)
else:
print(key, value)
# yield (key, value)
這里的問題是,當我沿著樹向下走時,我會呼叫該值subfolder并沿著那條路線走下去,但在此示例中,我有兩個位于同一級別的子檔案夾(test_sub和test_sub2),我需要獲取它們的值。
有誰知道任何奇特的方法來做到這一點?如果需要,我絕對可以重組資料輸入以使其更容易,例如,我的一個想法是將子檔案夾放在同一級別上,list但后來我在一個遞回函式中努力迭代這些元素。
任何想法的幫助將不勝感激。
uj5u.com熱心網友回復:
你可以迭代地呼叫recurse_over_objectunder if 'subfolder' in key:。就像:
def recurse_over_object(dict_obj):
for key, value in dict_obj.items():
if 'subfolder' in key:
for item in value:
recurse_over_object(item)
else:
print(key, value)
然后
for d in data:
recurse_over_object(d)
輸出:
name Business Operations
team_edit ['BusinessOperations']
team_view ['Snaptest']
name test_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
name test_sub2
name test_sub_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
uj5u.com熱心網友回復:
為了遵循您對使用yield()(以及print)的引導,這里是調整后的代碼,我認為它可以滿足您的問題。請注意,最后一條x = list( ... )陳述句旨在呼叫您的函式創建的生成器。
dataStructure = [
{'name': 'Business Operations',
'team_edit': ['BusinessOperations'],
'team_view': ['Snaptest'],
'test_sub_subfolder': [
{'name': 'test_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}],
'test_sub2_subfolder': [
{'name': 'test_sub2',
'test_sub_subfolder': [
{'name': 'test_sub_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}]}]}
]
def recurse_over_object(dict_obj):
for key, value in dict_obj.items():
if 'subfolder' in key:
'''
for pair in recurse_over_object(value[0]):
print(key, *pair)
yield (key, *pair)
'''
print(key, *list(recurse_over_object(value[0])))
yield(key, *list(recurse_over_object(value[0])))
else:
print(key, value)
yield (key, value)
x = list(recurse_over_object(dataStructure[0]))
輸出:
name Business Operations
team_edit ['BusinessOperations']
team_view ['Snaptest']
name test_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
test_sub_subfolder ('name', 'test_sub') ('team_edit', ['BusinessOperations', 'Freddy']) ('team_view', ['hugo'])
name test_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
name test_sub2
name test_sub_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
test_sub_subfolder ('name', 'test_sub_sub') ('team_edit', ['BusinessOperations', 'Freddy']) ('team_view', ['hugo'])
name test_sub_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
test_sub2_subfolder ('name', 'test_sub2') ('test_sub_subfolder', ('name', 'test_sub_sub'), ('team_edit', ['BusinessOperations', 'Freddy']), ('team_view', ['hugo']))
name test_sub2
name test_sub_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
test_sub_subfolder ('name', 'test_sub_sub') ('team_edit', ['BusinessOperations', 'Freddy']) ('team_view', ['hugo'])
name test_sub_sub
team_edit ['BusinessOperations', 'Freddy']
team_view ['hugo']
uj5u.com熱心網友回復:
您有一個包含串列、字典和字串的嵌套結構。遞回函式可以對其進行測驗以決定如何處理元素:
def get_branches(x, acc=()):
if isinstance(x, dict):
for k,v in x.items():
yield from get_branches(v, acc (k,))
elif isinstance(x, list):
for k in x:
yield from get_branches(k, acc)
else:
yield acc (x,)
x = [{'name': 'Business Operations',
'team_edit': ['BusinessOperations'],
'team_view': ['Snaptest'],
'test_sub_subfolder': [
{'name': 'test_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}],
'test_sub2_subfolder': [
{'name': 'test_sub2',
'test_sub_subfolder': [
{'name': 'test_sub_sub',
'team_edit': ['BusinessOperations', 'Freddy'],
'team_view': ['hugo']}]}]}]
print(list( get_branches(x) ))
輸出:
[('name', 'Business Operations'),
('team_edit', 'BusinessOperations'),
('team_view', 'Snaptest'),
('test_sub_subfolder', 'name', 'test_sub'),
('test_sub_subfolder', 'team_edit', 'BusinessOperations'),
('test_sub_subfolder', 'team_edit', 'Freddy'),
('test_sub_subfolder', 'team_view', 'hugo'),
('test_sub2_subfolder', 'name', 'test_sub2'),
('test_sub2_subfolder', 'test_sub_subfolder', 'name', 'test_sub_sub'),
('test_sub2_subfolder', 'test_sub_subfolder', 'team_edit', 'BusinessOperations'),
('test_sub2_subfolder', 'test_sub_subfolder', 'team_edit', 'Freddy'),
('test_sub2_subfolder', 'test_sub_subfolder', 'team_view', 'hugo')
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441353.html
標籤:Python python-3.x 字典 递归 递归查询
上一篇:在減少嵌套字典的同時保持字典結構
