Python 递归迭代列表
我正在解析JSON,并试图基于“parents”键递归创建一个树,但我很难获得预期的输出。以下是JSON:Python 递归迭代列表,python,recursion,Python,Recursion,我正在解析JSON,并试图基于“parents”键递归创建一个树,但我很难获得预期的输出。以下是JSON: { "cases": [ { "name": "A", "parents": [ "E", "B" ] }, { "name": "B", "paren
{
"cases": [
{
"name": "A",
"parents": [
"E",
"B"
]
},
{
"name": "B",
"parents": [
"C",
"D"
]
},
{
"name": "C",
"parents": [
"E"
]
},
{
"name": "D",
"parents": [
"E"
]
},
{
"name": "E",
"parents": [
]
}
]
}
这是我的代码:
import json
import copy
FILE="somefile.json"
def find_path(test_name, data, current_steps):
tc = return_test_data(test_name, data)
parents = tc.get('parents', [])
if not current_steps:
current_steps.append(test_name)
if not parents:
return current_steps
else:
temp_steps = []
for step in parents:
new_c_s = copy.deepcopy(current_steps)
new_c_s.append(step)
new_steps = find_path(step, data, new_c_s)
temp_steps.append(new_steps)
return temp_steps
def return_test_data(test_name, data):
for test in data['cases']:
if test['name'] == test_name:
return test
return False
if __name__ == "__main__":
data = json.load(open(FILE))
steps = find_path("A", data, [])
print ("Steps: {}".format(steps))
我希望看到一个简单的父母名单,按他们被找到的顺序排列:
Steps: ['A', 'E', 'B', 'C', 'E', 'D', 'E']
在本例中,A有两个父对象:E&B。迭代这两个对象以获取其父对象,因此结果将是:
['A', 'E', {parents of E}, 'B', {parents of B}].
因为E没有父母,B有C和D的父母,这(在我看来)变成:
最终变成:
['A', 'E', 'B', 'C', 'E', 'D', 'E']
相反,我得到:
Steps: [['A', 'E'], [[['A', 'B', 'C', 'E']], [['A', 'B', 'D', 'E']]]]
我确信我递归地传递了太多的内容,但无法准确地指出具体内容。您可以像这样对结构进行迭代: 代码: 结果:
看起来你把每一步都做得比必要的稍微复杂一些。我相信这会产生您想要的信息:
import json
FILE = "somefile.json"
def find_path(test_name, data):
dictionary = return_test_data(test_name, data)
if dictionary:
current_steps = [test_name]
if 'parents' in dictionary:
for parent in dictionary['parents']:
current_steps.extend(find_path(parent, data))
return current_steps
return None
def return_test_data(name, data):
for dictionary in data['cases']:
if dictionary['name'] == name:
return dictionary
return None
if __name__ == "__main__":
data = json.load(open(FILE))
steps = find_path("A", data)
print("Steps:", steps)
输出
> python3 test.py
Steps: ['A', 'E', 'B', 'C', 'E', 'D', 'E']
>
你能解释一下你的预期产出吗?如果你想在父元素中看到一个按其出现顺序排列的元素列表,那么你的预期输出不应该是
[“E”、“B”、“C”、“D”、“E”、“E”]
@ClockSlave在问题中添加了更多信息,希望澄清我需要一些足够灵活的方法来获得任何数据元素的父元素,例如,获取“B”的父级列表我对您发布的数据进行了响应。OP提供了一个起始点“a”,并希望按照父级的路径/树从该起始点构建数据。您的解决方案只是按照JSON返回数据的顺序遍历数据——如果数据以不同的顺序返回,您的代码将生成不同的结果,而这是不应该的。如果我们添加一个不相关的数据元素(不是列表中任何内容的父元素),它不应该出现在结果中,但您的解决方案将包括它,因为它忽略了问题的路径/树方面。这正是我所希望的。还有一个问题:假设D有a的父级-这将导致循环。有没有一种简单的方法来确定这种确切的联系?我知道我可以捕获递归错误,但我认为最好显示循环是什么。
['A', 'E', 'B', 'C', 'E', 'D', 'E']
import json
FILE = "somefile.json"
def find_path(test_name, data):
dictionary = return_test_data(test_name, data)
if dictionary:
current_steps = [test_name]
if 'parents' in dictionary:
for parent in dictionary['parents']:
current_steps.extend(find_path(parent, data))
return current_steps
return None
def return_test_data(name, data):
for dictionary in data['cases']:
if dictionary['name'] == name:
return dictionary
return None
if __name__ == "__main__":
data = json.load(open(FILE))
steps = find_path("A", data)
print("Steps:", steps)
> python3 test.py
Steps: ['A', 'E', 'B', 'C', 'E', 'D', 'E']
>