python—引用类型的巧用

  • 先有一个列表,装了很多字典,我们希望所有parent_id不为None的都将其放到对应id的键children下,并递归执行,实现一个多级字典,但递归是比较耗内存的,我们将使用引用类型的特殊方法来实现。
# 原始列表
comment_list = [
    {'id': 1, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': None},
    {'id': 2, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': None},
    {'id': 3, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': None},
    {'id': 4, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': 2},
    {'id': 5, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': 4},
    {'id': 6, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': 3},
    {'id': 7, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': None},
    {'id': 8, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': 5},
    {'id': 9, 'user': '杀杀杀', 'comment': '我丢', 'parent_id': 8},
]
# 最后存放结果的列表
comments = []	
# 将列表转化为字典,并用id作为comment_dict的键和添加一个children键值对
comment_dict = {}	
for _ in comment_list:
    _.update({'children': []})
    comment_dict[_['id']] = _
  • 转化为字典之后的结果:
print(comment_dict)
"""
{
	1: {
		'id': 1,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': None,
		'children': []
	},
	2: {
		'id': 2,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': None,
		'children': []
	},
	3: {
		'id': 3,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': None,
		'children': []
	},
	4: {
		'id': 4,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 2,
		'children': []
	},
	5: {
		'id': 5,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 4,
		'children': []
	},
	6: {
		'id': 6,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 3,
		'children': []
	},
	7: {
		'id': 7,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': None,
		'children': []
	},
	8: {
		'id': 8,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 5,
		'children': []
	},
	9: {
		'id': 9,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 8,
		'children': []
	}
}
"""
  • 接下来修改这个字典中有children值的项,将对应的children加入到键值对中,
for v in comment_dict.values():
    if not v['parent_id']
    	# 将parent_id为None,即这里只放入所有第一级元素
        comments.append(v)
    else:
    	"""注意在这里只修改了原来字典中的children值"""
        comment_dict[v['parent_id']]['children'].append(v)
        

print(comments)

当我们打印comments时会发现已经实现了多级字典

[{
	'id': 1,
	'user': '杀杀杀',
	'comment': '我丢',
	'parent_id': None,
	'children': []
}, {
	'id': 2,
	'user': '杀杀杀',
	'comment': '我丢',
	'parent_id': None,
	'children': [{
		'id': 4,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 2,
		'children': [{
			'id': 5,
			'user': '杀杀杀',
			'comment': '我丢',
			'parent_id': 4,
			'children': [{
				'id': 8,
				'user': '杀杀杀',
				'comment': '我丢',
				'parent_id': 5,
				'children': [{
					'id': 9,
					'user': '杀杀杀',
					'comment': '我丢',
					'parent_id': 8,
					'children': []
				}]
			}]
		}]
	}]
}, {
	'id': 3,
	'user': '杀杀杀',
	'comment': '我丢',
	'parent_id': None,
	'children': [{
		'id': 6,
		'user': '杀杀杀',
		'comment': '我丢',
		'parent_id': 3,
		'children': []
	}]
}, {
	'id': 7,
	'user': '杀杀杀',
	'comment': '我丢',
	'parent_id': None,
	'children': []
}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值