报障系统之多级评论

Posted bigdata_devops

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了报障系统之多级评论相关的知识,希望对你有一定的参考价值。

一、列表前戏:

#例1
v1 = [1,2,3,4]
v1.append(123)
print(v1)#[1, 2, 3, 4, 123]
#例2
v1 = {k1:v1}
v1[k2] = v2
print(v1)#{k1: v1, k2: v2}
#例3
data = [
    [11,22,33],
    [44,55,66]
]
data1=data[0]
data2 = data1.append(data[1])
print(data1)#[11, 22, 33, [44, 55, 66]]
#
# data=data[0].append(data[1])
print(data)#[[11, 22, 33, [44, 55, 66]], [44, 55, 66]]
print(data[1])#[44, 55, 66]
data[1].append(77)
print(data)#[[11, 22, 33, [44, 55, 66, 77]], [44, 55, 66, 77]]
print(data[0][3])#[44, 55, 66, 77]

##例4
data = [
    {k1:v1},
    {k2:v2}
]
for item in data:
    item[kk] = vv
print(data)#[{k1: v1, kk: vv}, {k2: v2, kk: vv}]
#引用类型

 

二、原理

msg_list = [
    {id:1,content:xxx,parent_id:None},
    {id:2,content:xxx,parent_id:None},
    {id:3,content:xxx,parent_id:None},
    {id:4,content:xxx,parent_id:1},
    {id:5,content:xxx,parent_id:4},
    {id:6,content:xxx,parent_id:2},
    {id:7,content:xxx,parent_id:5},
    {id:8,content:xxx,parent_id:3},
]
#python里面的apend之类的东西都是引用的原来数据的内存地址,对原数据进行操作的话
#我们引用的数据也会发生一样的变化(字典列表之类的)
 
#浙江片子的方法
# for i in msg_list:
#     i[child]=[]
# for i in range(len(msg_list)-1,-1,-1):
#     if msg_list[i][parent_id]:
#         msg_list[msg_list[i][parent_id] - 1][child].append(msg_list[i])
# new_msg_list = [i for i in msg_list if i[parent_id] is None]
# print(new_msg_list)
 
冒泡排序的效率比较低,因为要多加几层循环
#老师讲的方法 # v
=[row.setdefault(child,[]) for row in msg_list] #这是一个列表生成式,其中列表生成式前缀不能是表达式(不能带等于号),这和底下的第一个for循环的作用是一样的,给每一个元素加一个‘child‘:[] # print(msg_list) #如果我们想加快索引(快点找到数据的话)就建一个字典的数据结构 msg_list_dict={} #加快索引,节省时间 for item in msg_list: item[child]=[] #相当于加一个键值对,{‘id‘:1,‘content‘:‘xxx‘,‘parent_id‘:None,‘child‘:[]} msg_list_dict[item[id]]=item #字典中key为item[id],value为item
#
msg_list_dict[item[‘id‘]]=item 相当于如下字典

  msg_list_dict = {
    1:{‘id‘:1,‘content‘:‘xxx‘,‘parent_id‘:None,‘child‘:}
    2:{‘id‘:2,‘content‘:‘xxx‘,‘parent_id‘:None,‘child‘:}
    ‘‘‘‘‘‘
  }


    #把字典数据结构填上数据,能够加快索引,而且我们数据还是占得原来的内存空间
    #我们只是引用了数据的内容空间,所以不存在新的数据结构浪费空间一说
result=[]
for item in msg_list:
    pid=item[parent_id]
    if pid: #如果parent_id不为空,说明它是子级,要把自己加入对应的父级
        msg_list_dict[pid][child].append(item)
    else: #如果为空,说明他是父级,要把它单独领出来用
        result.append(item)
#result就是我们最终要的结果,因为这里面全是引用,所有数据的内存地址都没有变
#只不过被多个数据结构引用了而已
print(result)

 

三、Python 字典(Dictionary) setdefault()方法


描述

Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

语法

setdefault()方法语法:

dict.setdefault(key, default=None)

参数

  • key -- 查找的键值。
  • default -- 键不存在时,设置的默认键值。

返回值

如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

以上是关于报障系统之多级评论的主要内容,如果未能解决你的问题,请参考以下文章

西游之路——python全栈——报障系统之后台管理

报障系统之填充基本数据

报障系统之博客主页及后台管理

django报障系统之解决工单和报表

多级评论代码实现(前端篇)

Django第8章: 多级评论树