【Python】对字典列表进行去重追加

  (TOC)

  

目标

  

现有字典列表

  
 <=坝镅詐ython代码类> #
  一个={dict1}, {dict2}]
  B=[{dict3}, {dict2}]
  C=[{dict3}, {dict4}]
  M=(A, B, C)
  X=[]  
  

将M去重后的字典放入列表X中,得到<代码> X=[{dict1}, {dict2}, {dict3}, {dict4}]

  

难点

  

字典列表

  

大家可能一开始会想到使用<代码>设置()函数转化为集合,自动去重。但是集合是使用散列来计算并去重的,但是字典类型无法使用散列计算。虽然可以使用类类或<代码>者命名元组<代码> namedtupe>   

列表无集合操作的方法

  

列表之间无法使用交并差(<代码>和,<代码> | ,<代码> - )的方式的集合计算方法

  

思路

  
 <代码类="语言python "> # json、性能差
  data=https://www.yisu.com/zixun/set ([json.dumps d (d)的数据)
  data=[json.loads d (d)的数据)
  
  #这种方式只能对ABC生效,对M还需要再一次循环,玛法
  sortedlist=[]
  
  在listwhichneedssorting:项
  如果项目不是在sortedlist:
  sortedlist.append(项)
  
  #这种缩短了两行
  M:我的
  X。扩展(过滤器(λ:年代不是X,我))
  
  #使用扩展()而不是append(),因为我们需要拼接的是字典列表,而不是列表的列的表
  #λ:年代X,米匿名函数,对我中的元素是否在X中进行判断
  #过滤器()对上面匿名函数中不满足条件(即重复的字典)进行过滤,返回尚未添加到X中的字典元素列表
  #使用扩展()进行追加到X中 
  

应用

  

主要是从neo4j中取出关系数据,分离节点,连接的关系,并转换为前端适用的数据返回

  
 <代码类="语言python "> def get_nodes_relationships (graph_list=None, ret_format=None):
  ”“”
  将将关系与节点分离到各自的列表中
  :param graph_list:
  :param ret_format:
  返回:
  ”“”
  node_list=[]
  relationship_list=[]
  因为我在地图(λx: x。(“图”,没有一个). get(节点),graph_list):
  node_list。扩展(过滤器(λx: node_list, i))
  米图(λy: y。(“图”,没有一个)。(“关系”,没有一个),graph_list):
  relationship_list。扩展(过滤器(λx: relationship_list, m))
  #我和米都是由字典组成的列的表,我为单字典列表,m为多字典列表,
  #前端要求去重,这里使用函数式语句返回没有在结果列表中出现的字典,然后使用扩展()追加
  
  #如果是面向d3,需要更改部分信息为d3适配
  如果ret_format==癲3”:
  def to_d3(链接):
  ”“”
  面向d3框架更改关系的键名,增加节点的数字类型
  :param链接:关系
  返回:更改后返回
  ”“”
  #使用推出键值对,重新推入的方式实现变更键名为前端可以识别的来源
  link.update(源=link.pop (startNode))
  #使用推出键值对,重新推入的方式实现变更键名为前端可以识别的目标
  link.update(目标=link.pop (endNode))
  value_map={
  “meta_in”: 1、
  “slave_of”: 2
  “shard_to”: 3
  }
  链接(“价值”)=value_map[链接('类型'])
  返回链接
  
  relationship_list=地图(λx: to_d3 (x) relationship_list)
  
  #如果是面向echarts,需要更改部分信息为echarts适配
  如果ret_format==癳charts”:
  def to_echarts(节点=None,链接=None):
  ”“”
  echarts适配
  :param节点:单个节点
  :param链接:单个关系
  返回:更改后的节点或者关系
  ”“”
  如果(节点和链接)或(节点和链接是没有问题):
  print(“去你妈的”)
  退出(1)
  如果节点:
  节点['名字']=节点(“id”)
  节点(“拖拽”)=True
  节点(“类别”)=节点['标签'][0]
  德尔节点(“标签”)
  # del节点(“属性”)
  bom=节点
  如果链接:
  #使用推出键值对,重新推入的方式实现变更键名为前端可以识别的来源
  link.update(源=link.pop (startNode))
  #使用推出键值对,重新推入的方式实现变更键名为前端可以识别的目标
  link.update(目标=link.pop (endNode))
  link.update(类别=link.pop('类型'))
  德尔链接(“id”)
  德尔链接(“属性”)
  # del链接(“类别”)
  bom=链接
  返回物料清单
  node_list=地图(λ节点:to_echarts(节点),node_list)
  relationship_list=地图(λ关系:to_echarts(链接=关系),relationship_list)
  
  #为什么要用设置而不是列表来转化地图对象:
  # 1。去重
  # 2。减小对象大小,达到缩减内存占用
  #为什么还是用列表而不是准备好了吗?
  # 1. dict对象不能被散列计算
  ret={“节点”:列表(node_list)、“链接”:列表(relationship_list)}
  
  返回ret 

【Python】对字典列表进行去重追加