在Python中实现递归有困难吗

2024-04-26 23:29:30 发布

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

我已经读了尽可能多的递归线程,但我还是有点迷路。我不想找任何人专门为我编码,但我会非常感谢一些方向。你知道吗

我有一大块JSON作为字典导入Python。我有一个函数,可以查看记录并将id添加到列表中。但是,此函数只会查看第一个“级别”的子级。有人能建议我如何开始递归调用这个函数,这样它就可以跟随树,不管它有多深?你知道吗

顺便说一句,我的数据本质上是一个二叉树,所以我需要它遵循多个分支路径。你知道吗

以下是我目前所拥有的非常混乱的功能:

def addFighter(fighterDict, database):
    childID = [child["id"] for child in fighterDict["children"]]
    database.append(childID)

    for child in childID:
        addFighter(child)

我知道我的for循环是错误的,但是我不确定在哪里可以找到合适的资源来解释接下来的步骤。你知道吗

谢谢你的帮助!你知道吗

编辑:

是的,我是说二叉树。抱歉,如果这不是CS术语。我有野生动物生物学的背景。:)

我的数据是巴西柔术黑带血统。例如,前田光雄培训了路易斯·弗朗卡和卡洛斯·格雷西。路易斯·弗朗卡培训了奥斯瓦尔多·法达,后者培训了9人。老卡洛斯·格雷西训练了21个人等等。数据有很多层次,包含1664条黑带。你知道吗

我已经将我的数据从JSON转换成一个大的嵌套字典。我正在尝试将其转换为一个平面字典,以便可以使用Psycopg2将其导入Postgres。我的最终目标是有一个表格,在一列中列出一个战士,第二列将是一个ID列表或他们训练过的人的名字。你知道吗

编辑2:

代码片段:(我不确定格式化这个的最佳方式)

{"id":-301,"name":"The Beginning","data":"Mitsoyo Maeda, children [id]","children":    [{"id":467,"name":"Takeo Iano ","data":"Mitsoyo Maeda, children [id]","children":[{"id":974536,"name":"Francisco Sa ","data":"Mitsoyo Maeda, children [id]","children":[{"id":975533,"name":"Daniel Beleza ","data":"Mitsoyo Maeda, children [id]","children":[]},{"id":1168951,"name":"Carlos Pinto Sa ","data":"Mitsoyo Maeda, children [id]","children":[{"id":1169948,"name":"Reginaldo de Almeida ","data":"Mitsoyo Maeda, children [id]","children":[]},{"id":1272639,"name":"Ademir Oliveira ","data":"Mitsoyo Maeda, children [id]","children":[]},{"id":1273636,"name":"Daniel Taveras ","data":"Mitsoyo Maeda, children [id]","children":[]}]}]}]},{"id":1464,"name":"Mitsuyo Maeda ","data":"Mitsoyo Maeda, children [id]","children":[{"id":2461,"name":"Luis Franca ","data":"Mitsoyo Maeda, children [id]","children":[{"id":4455,"name":"Oswaldo Fadda ","data":"Mitsoyo Maeda, children [id]","children":[{"id":83218,"name":"Sergio Amarel ","data":"Mitsoyo Maeda, children [id]","children":[]},{"id":84215,"name":"Ronald Bauer ","data":"Mitsoyo Maeda, children [id]","children":[{"id":1230765,"name":"Victor da Costa ","data":"Mitsoyo Maeda, children [id]","children":[]}]},{"id":85212,"name":"Beto Ferrao ","data":"Mitsoyo Maeda, children [id]","children":[{"id":160984,"name":"Andre Assuncao ","data":"Mitsoyo Maeda, children [id]","children":[]}]},

Tags: 数据函数nameidjsonchild列表for
1条回答
网友
1楼 · 发布于 2024-04-26 23:29:30

看起来很接近。据我所知,这样做更合适:

database = []

def addFighter(fighterDict, database):
  # add this fighters id to the database
  database.append(fighterDict["id"])

  # get children if any
  children = fighterDict.get("children", [])

  for child in children:
    # for each child, run the addFighter method
    addFighter(child, database)

addFighter(someDictOfFighters, database)

print database

所以,看起来你有斗士字典,至少包含id和一个子键,其值更像斗士字典。比如:{“id”:1,“children”:[{“id”:2,“children”:[{“id”:4}},{“id”:3}}。我想我是对的。你知道吗

将其传递给函数,它将获得第一个id(1)并将其添加到数据库中。然后它会看到子对象(ids2和id3)并对每个子对象运行函数。你知道吗

对于ID2,它将2添加到数据库中,然后对其子项(4)运行函数。你知道吗

4没有子对象,因此它将4添加到数据库中,为子对象获取一个空列表,并且不再运行任何递归。你知道吗

然后,我们一直返回到函数的第一个实例,并使用id 3在dict上调用它。3将被添加到数据库中,并且子级将存在一个空列表,并且从此处不再调用该函数。你知道吗

我们返回到第一个调用,完成for循环。我们知道,假设数据库是一个列表,数据库=[1,2,4,3]。你知道吗

相关问题 更多 >