在dict列表中查找循环路径(Python)

在dict列表中查找循环路径(Python),python,list,dictionary,path,circular-dependency,Python,List,Dictionary,Path,Circular Dependency,我有这样的数据 mydict = [ {"id": 0, "item_total": 10000, "send_to_id": None}, {"id": 1, "item_total": 15000, "send_to_id": None}, {"id": 2, "item_total": 30000, &quo

我有这样的数据

mydict = [
    {"id": 0, "item_total": 10000, "send_to_id": None},
    {"id": 1, "item_total": 15000, "send_to_id": None},
    {"id": 2, "item_total": 30000, "send_to_id": 1},
    {"id": 3, "item_total": 20000, "send_to_id": None},
...
]
其中id始终是dict在列表中的位置

将聚合项目总数,“发送到id”键会影响聚合的发生方式。这里,由于“id”=2的dict具有“send_to_id”=1,因此“id”=1的dict就是我所称的目标层,这两个项的总和将以不同于正常值的方式进行聚合

不允许的是这样的循环,其中项目1指向项目2,项目2指向项目1

mydict = [
    {"id": 0, "item_total": 10000, "send_to_id": None},
    {"id": 1, "item_total": 15000, "send_to_id": 2},
    {"id": 2, "item_total": 30000, "send_to_id": 1},
    {"id": 3, "item_total": 20000, "send_to_id": None}
]
或者这个,它仍然是圆形的,需要三个步骤

mydict = [
    {"id": 0, "item_total": 10000, "send_to_id": None},
    {"id": 1, "item_total": 15000, "send_to_id": 3},
    {"id": 2, "item_total": 30000, "send_to_id": 1},
    {"id": 3, "item_total": 20000, "send_to_id": 2}
]
项目也不能指向自身

我不知道该怎么做,但我想看看上面的dict列表,看看是否存在循环路径,以便向用户提供适当的错误消息。有人能帮忙吗? 我正试图找出一条通向下一个项目的路径,但这在我的大脑中造成了很大的困扰

如果有必要的话,名单的最长长度将是50人左右


谢谢

好的第一步可能是创建一个只包含地图的字典。我们可以用一个漂亮的(看看下面的第二个绿色代码示例块)

def get_direct_映射(数据:列表)->dict:
如果d[“send_to_id”]不是None,则返回数据中d的{d[“id”]:d[“send_to_id”]
现在我们有了一个更容易解决的问题,我们可以用它来帮助我们。具体来说,我们基本上可以重复使用在“更新”之后发布的解决方案,并将上面的代码添加到其中

def find_循环(原始数据:列表)->列表:
n={d[“id”]:如果d[“send_to_id”]不是None,则原始_数据中d的d[“send_to_id”]
周期=[]
而n:
访问={}
计数=0
k、 v=n.popitem()
虽然v不是无:
#已访问[k]=(计数,v)
已访问[k]=计数
计数+=1
k=v
v=n.pop(k,无)
如果访问了k in:
如果len(访问)==1:
cycle=tuple(visted.keys())
其他:
循环开始=已访问[k]
cycle=已排序((c,k)表示已访问的.items()中的k,c,如果c>=cycle\u start)
循环=元组(k表示c,k表示循环)
k=min(范围(len(循环)),key=lambda x:cycle[x])
循环=循环[k:][循环[:k]
cycles.append(循环)
返回周期
虽然它不是最漂亮的,但它很管用

mydict=[
{“id”:0,“item_total”:10000,“send_to_id”:None},
{“id”:1,“项目总数”:15000,“发送至id”:3},
{“id”:2,“项目总数”:30000,“发送给id”:1},
{“id”:3,“项目总数”:20000,“发送至id”:2}
]
打印(查找周期(mydict))
#打印[(1、3、2)]
mydict=[
{“id”:0,“item_total”:10000,“send_to_id”:None},
{“id”:1,“项目总数”:15000,“发送至id”:2},
{“id”:2,“项目总数”:30000,“发送给id”:1},
{“id”:3,“项目总数”:20000,“发送至id”:无}
]
打印(查找周期(mydict))
#打印[(1,2)]
mydict=[
{“id”:0,“item_total”:10000,“send_to_id”:None},
{“id”:1,“项目总数”:15000,“发送至id”:无},
{“id”:2,“项目总数”:30000,“发送给id”:1},
{“id”:3,“项目总数”:20000,“发送至id”:无},
]
打印(查找周期(mydict))
#打印[]

哦,太棒了。我确实环顾了一下四周,但不确定如何用谷歌搜索。谢谢