中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

【Python】對字典列表進(jìn)行去重追加

[TOC]

創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)呈貢,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

目標(biāo)

現(xiàn)有字典列表

    # 
    A = [ {dict1}, {dict2} ]
    B = [ {dict3}, {dict2} ]
    C = [ {dict3},  {dict4} ]
    M = [A,B,C]
    X = []

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

難點(diǎn)

字典列表

大家可能一開始會想到使用set()函數(shù)轉(zhuǎn)化為集合,自動去重。但是集合是使用hash來計(jì)算并去重的,但是字典類型無法使用Hash計(jì)算。雖然可以使用類class或者命名元組namedtupe來替換字典,但是這次的場景是無法變更列表的產(chǎn)生源的。

列表無集合操作的方法

列表之間無法使用交并差(&,|,-)的方式的集合計(jì)算方法

思路

# 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(),因?yàn)槲覀冃枰唇拥氖亲值淞斜?,而不是列表的列?# lamda s: s not in X, M 匿名函數(shù),對i中的元素是否在X中進(jìn)行判斷
# filter() 對上面匿名函數(shù)中不滿足條件(即重復(fù)的字典)進(jìn)行過濾,返回尚未添加到X中的字典元素列表
# 使用extend()進(jìn)行追加到X中

應(yīng)用

主要是從neo4j中取出關(guān)系數(shù)據(jù),分離節(jié)點(diǎn),連接的關(guān)系,并轉(zhuǎn)換為前端適用的數(shù)據(jù)返回

def get_nodes_relationships(graph_list=None, ret_format=None):
    """
    將將關(guān)系與節(jié)點(diǎn)分離到各自的列表中
    :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é)點(diǎn)的數(shù)字類型
            :param link: 關(guān)系
            :return: 更改后返回
            """
            # 使用推出鍵值對,重新推入的方式實(shí)現(xiàn)變更鍵名為前端可以識別的source
            link.update(source=link.pop('startNode'))
            # 使用推出鍵值對,重新推入的方式實(shí)現(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é)點(diǎn)
            :param link: 單個關(guān)系
            :return: 更改后的節(jié)點(diǎn)或者關(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:
                # 使用推出鍵值對,重新推入的方式實(shí)現(xiàn)變更鍵名為前端可以識別的source
                link.update(source=link.pop('startNode'))
                # 使用推出鍵值對,重新推入的方式實(shí)現(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.減小對象大小,達(dá)到縮減內(nèi)存占用
    # 為什么還是用list而不是set?
    #  1.dict對象不能被hash計(jì)算
    ret = {"nodes": list(node_list), "links": list(relationship_list)}

    return ret

網(wǎng)站欄目:【Python】對字典列表進(jìn)行去重追加
分享網(wǎng)址:http://www.rwnh.cn/article12/pgsedc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化網(wǎng)站設(shè)計(jì)、微信小程序Google、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
共和县| 长武县| 同德县| 乌鲁木齐县| 襄城县| 辽阳市| 左贡县| 汕尾市| 酒泉市| 苍南县| 和林格尔县| 中山市| 明星| 宣汉县| 渝北区| 德清县| 读书| 东乌珠穆沁旗| 和平县| 鸡东县| 农安县| 闽侯县| 修水县| 托克托县| 定陶县| 江北区| 恭城| 南乐县| 项城市| 福建省| 鄂托克前旗| 沾化县| 进贤县| 娱乐| 无锡市| 泰和县| 白城市| 鲁山县| 竹北市| 安顺市| 平利县|