python pid/id 分组得到如何得到制定格式的数据?

发布于 2022-09-05 23:01:52 字数 1058 浏览 14 评论 0

我知道用递归,但是就是写不出来,
相关问题链接:https://segmentfault.com/q/10...
原始数据

1 My Documents 0
2 photos 1
3 Friend 2
4 Wife 2
5 Company 2
6 Program Files 1
7 Intel 6
8 Java 6

原始数据格式

(
    {
        'id': 1,
        'name': 'My Documents',
        'pid': 0
     },
    {
        'id': 2,
        'name': 'photos ',
        'pid': 1
     },
    {
        'id': 3,
        'name': 'Friend',
        'pid': 2
     },
    {
        'id': 4,
        'name': 'Wife',
        'pid': 2
     },
    {
        'id': 5,
        'name': 'Company',
        'pid': 2
     },
    {
        'id': 6,
        'name': 'Program Files',
        'pid': 1
    },
    {
        'id': 8 ,
        'name': 'Java ',
        'pid': 6
    },
)

得到目标数据:
将name关联依次用 ‘_’ 链接直到尾节点,例如下面

[
    {
        'id': 2,
        'name': 'My Documents_ photos',
    },
    {
        'id': 8,
        'name': 'My Documents_Program Files_java'
    },
    ...
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

爱冒险 2022-09-12 23:01:52
def find(arr,id):
    for idx, e in enumerate(arr):
        if e['id'] == id:
            return idx
    return -1
    
def path(arr, n):
    print(n)
    if arr[n]['pid'] == 0:
        return arr[n]['name']
    else:
        return path(arr, find(arr, arr[n]['pid'])) + '_' + arr[n]['name']
        
def generate(arr,n):
    return {'id':n, 'name':path(arr,find(arr,n))}
 generate(arr,6) #{'id': 6, 'name': 'My Documents_Program Files'}
极度宠爱 2022-09-12 23:01:52

面向对象的, 可以再封装

raw = \
(
    {
        'id': 1,
        'name': 'My Documents',
        'pid': 0
     },
    {
        'id': 2,
        'name': 'photos ',
        'pid': 1
     },
    {
        'id': 3,
        'name': 'Friend',
        'pid': 2
     },
    {
        'id': 4,
        'name': 'Wife',
        'pid': 2
     },
    {
        'id': 5,
        'name': 'Company',
        'pid': 2
     },
    {
        'id': 6,
        'name': 'Program Files',
        'pid': 1
    },
    {
        'id': 8 ,
        'name': 'Java ',
        'pid': 6
    },
)


class Node:
    def __init__(self, id, name, pid):
        self.id = id
        self.name = name
        self.pid = pid
        self.children = []
        self.parent = None

    def __lt__(self, other):
        if self.pid < other.pid:
            return True
        elif self.pid == other.pid and self.id < other.id:
            return True
        return False

    @staticmethod
    def print_path(n):
        path = n.name
        while n.parent:
            path = n.parent.name + '_' + path
            n = n.parent
        print(path)

nodes = [Node(**_) for _ in raw]
nodes.sort()
tmp = {}

for node in nodes:
    tmp[node.id] = node
    if node.pid in tmp:
        tmp[node.pid].children.append(node)
        node.parent = tmp[node.pid]


for node in nodes:
    Node.print_path(node)
    
'''
My Documents
My Documents_photos 
My Documents_Program Files
My Documents_photos _Friend
My Documents_photos _Wife
My Documents_photos _Company
My Documents_Program Files_Java 
'''
金兰素衣 2022-09-12 23:01:52

'''
将数据生成递归结果集
'''

!/usr/bin/python3

-- coding: UTF-8 --

arr = (

{
    'id': 1,
    'name': 'My Documents',
    'pid': 0
},
{
    'id': 2,
    'name': 'photos ',
    'pid': 1
},
{
    'id': 3,
    'name': 'Friend',
    'pid': 2
},
{
    'id': 4,
    'name': 'Wife',
    'pid': 2
},
{
    'id': 5,
    'name': 'Company',
    'pid': 2
},
{
    'id': 6,
    'name': 'Program Files',
    'pid': 1
},
{
    'id': 8,
    'name': 'Java ',
    'pid': 6
},

)

def get_node(arr, id):

for node in arr:
    if node['id'] == id:
        if node['pid'] == 0:
            return node['name']
        else:
            return get_node(arr, node['pid']) + '_' + node['name']
else:
    return ''

for i in arr:

node = {'id': i['id'], 'name': get_node(arr, i['id'])}
print(node)
像你 2022-09-12 23:01:52
raw= (
    {
        'id': 1,
        'name': 'My Documents',
        'pid': 0
     },
    {
        'id': 2,
        'name': 'photos ',
        'pid': 1
     },
    {
        'id': 3,
        'name': 'Friend',
        'pid': 2
     },
    {
        'id': 4,
        'name': 'Wife',
        'pid': 2
     },
    {
        'id': 5,
        'name': 'Company',
        'pid': 2
     },
    {
        'id': 6,
        'name': 'Program Files',
        'pid': 1
    },
    {
        'id': 8 ,
        'name': 'Java ',
        'pid': 6
    },
)
def getname(id,btr):
  for a in raw:
    if a["id"] == id:
      if a["pid"] == 0:
          btr = a["name"] + "_" + btr
          print btr.strip("_")
      else:
          btr = a["name"] + "_" + btr
          getname(a["pid"], btr)


for b in raw:
  btr = ""
  getname(b["id"], btr)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文