[TOC]
創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計,香河網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:香河等地區(qū)。香河做網(wǎng)站價格咨詢:13518219792現(xiàn)有字典列表
#
A = [ {dict1}, {dict2} ]
B = [ {dict3}, {dict2} ]
C = [ {dict3}, {dict4} ]
M = [A,B,C]
X = []
將M去重后的字典放入列表X中,得到X = [{dict1}, {dict2},{dict3}, {dict4}]
大家可能一開始會想到使用set()
函數(shù)轉(zhuǎn)化為集合,自動去重。但是集合是使用hash來計算并去重的,但是字典類型無法使用Hash計算。雖然可以使用類class
或者命名元組namedtupe
來替換字典,但是這次的場景是無法變更列表的產(chǎn)生源的。
列表之間無法使用交并差(&
,|
,-
)的方式的集合計算方法
# json,性能差
data = set([json.dumps(d) for d in data])
data = [json.loads(d) for d in data]
# 這種方式只能對ABC生效,對M還需要再一次循環(huán),瑪法
sortedlist = []
for item in listwhichneedssorting:
if item not in sortedlist:
sortedlist.append(item)
# 這種縮短了兩行
for i in M:
X.extend(filter(lamda s: s not in X, i))
# 使用extend()而不是append(),因為我們需要拼接的是字典列表,而不是列表的列表
# lamda s: s not in X, M 匿名函數(shù),對i中的元素是否在X中進行判斷
# filter() 對上面匿名函數(shù)中不滿足條件(即重復(fù)的字典)進行過濾,返回尚未添加到X中的字典元素列表
# 使用extend()進行追加到X中
主要是從neo4j中取出關(guān)系數(shù)據(jù),分離節(jié)點,連接的關(guān)系,并轉(zhuǎn)換為前端適用的數(shù)據(jù)返回
def get_nodes_relationships(graph_list=None, ret_format=None):
"""
將將關(guān)系與節(jié)點分離到各自的列表中
:param graph_list:
:param ret_format:
:return:
"""
node_list = []
relationship_list = []
for i in map(lambda x: x.get('graph', None).get('nodes'), graph_list):
node_list.extend(filter(lambda x: x not in node_list, i))
for m in map(lambda y: y.get('graph', None).get('relationships', None), graph_list):
relationship_list.extend(filter(lambda x: x not in relationship_list, m))
# i和m都是由字典組成的列表,i為單字典列表,m為多字典列表,
# 前端要求去重,這里使用函數(shù)式語句返回沒有在結(jié)果列表中出現(xiàn)的字典,然后使用extend()追加
# 如果是面向d3,需要更改部分信息為d3適配
if ret_format == 'd3':
def to_d3(link):
"""
面向d3框架更改關(guān)系的鍵名,增加節(jié)點的數(shù)字類型
:param link: 關(guān)系
:return: 更改后返回
"""
# 使用推出鍵值對,重新推入的方式實現(xiàn)變更鍵名為前端可以識別的source
link.update(source=link.pop('startNode'))
# 使用推出鍵值對,重新推入的方式實現(xiàn)變更鍵名為前端可以識別的target
link.update(target=link.pop('endNode'))
value_map = {
"meta_in": 1,
"slave_of": 2,
"shard_to": 3
}
link['value'] = value_map[link['type']]
return link
relationship_list = map(lambda x: to_d3(x), relationship_list)
# 如果是面向echarts,需要更改部分信息為echarts適配
if ret_format == 'echarts':
def to_echarts(node=None, link=None):
"""
echarts適配
:param node: 單個節(jié)點
:param link: 單個關(guān)系
:return: 更改后的節(jié)點或者關(guān)系
"""
if (node and link) or (node is None and link is None):
print("fuck you")
exit(1)
if node:
node['name'] = node['id']
node['draggable'] = True
node['category'] = node['labels'][0]
del node['labels']
# del node['properties']
bom = node
if link:
# 使用推出鍵值對,重新推入的方式實現(xiàn)變更鍵名為前端可以識別的source
link.update(source=link.pop('startNode'))
# 使用推出鍵值對,重新推入的方式實現(xiàn)變更鍵名為前端可以識別的target
link.update(target=link.pop('endNode'))
link.update(category=link.pop('type'))
del link['id']
del link['properties']
# del link['category']
bom = link
return bom
node_list = map(lambda node: to_echarts(node), node_list)
relationship_list = map(lambda relation: to_echarts(link=relation), relationship_list)
# 為什么要用set而不是list來轉(zhuǎn)化map對象:
# 1.去重
# 2.減小對象大小,達到縮減內(nèi)存占用
# 為什么還是用list而不是set?
# 1.dict對象不能被hash計算
ret = {"nodes": list(node_list), "links": list(relationship_list)}
return ret
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。