簡體   English   中英

如何從 python List-Dictionary 中搜索和刪除特定的鍵:值條目

[英]How to search and remove specific key:value entries from a python List-Dictionary

我們如何搜索/比較 key:values 並從列表中刪除整行?

想要從列表中刪除整行,以便從列表字典中刪除特定出現的 (key:value) "activity:insert"。

我嘗試了下面的代碼,但它無法刪除具有特定鍵:值對的行

for k in jsod:
    if key in ('activity') and k[activity] == 'insert':
        del k[key]
[OrderedDict([('name', 'pageshift'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'bigdata'), ('value', ''), ('activity', 'freeze'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'spark'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'django'), ('value', ''), ('activity', 'insert'), ('host_name', False), ('db_name', True)])] 
for k in jsod:
    if k["activity"]=='insert':
        jsod.remove(k)

在您的問題中,您是從 OrderedDict 中刪除 key:value 對,而不是從列表中刪除 OrderedDict。 在我上面寫的代碼中,我對其進行了更改,以從列表中刪除整個 OrderedDict(您稱之為的行)。

編輯:這是一個完整的程序,顯示了使用活動 = False 的情況:

from collections import OrderedDict

jsod=[OrderedDict([('name', 'pageshift'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'bigdata'), ('value', ''), ('activity', 'freeze'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'spark'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'django'), ('value', ''), ('activity', 'insert'), ('host_name', False), ('db_name', True)]),
 OrderedDict([('name', 'django'), ('value', ''), ('activity', False), ('host_name', False), ('db_name', True)])] 

key_to_remove="activity"
value_to_remove=False

for k in jsod:
    if k[key_to_remove]==value_to_remove:
        jsod.remove(k)

print(jsod)

這打印:

[OrderedDict([('name', 'pageshift'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]), 
OrderedDict([('name', 'bigdata'), ('value', ''), ('activity', 'freeze'), ('host_name', False), ('db_name', True)]),
OrderedDict([('name', 'spark'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]), 
OrderedDict([('name', 'django'), ('value', ''), ('activity', 'insert'), ('host_name', False), ('db_name', True)])]

這表明第 5 個 OrderedDict 與 ("activity",False) 已被刪除。

from collections import OrderedDict

jsod = [OrderedDict(
    [('name', 'pageshift'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
        OrderedDict(
            [('name', 'bigdata'), ('value', ''), ('activity', 'freeze'), ('host_name', False), ('db_name', True)]),
        OrderedDict(
            [('name', 'spark'), ('value', ''), ('activity', 'dataupdate'), ('host_name', False), ('db_name', True)]),
        OrderedDict(
            [('name', 'django'), ('value', ''), ('activity', 'insert'), ('host_name', False), ('db_name', True)])]

for each in jsod:
    if each['activity'] == 'insert':
        jsod.remove(each)

print(jsod)

這應該可以完成工作。

使用 dict get方法可能更適合布爾值。 這將刪除所有OrderedDictsbadpairs列表中的任何對:

    results = make_dict_list()
    badpairs = (("activity", False), ("activity", "insert")) 
    for pair in badpairs:
        for i, x in enumerate(results):
            if x.get(pair[0]) == pair[1]:     #get doesn't throw KeyError
                print('HIT!')
                del(results[i])               #specific indexing rather than del(x)
            else: print('MISS!') 
        print("----------------") 
    print(results)

這是一個從元組列表生成 OrderedDict 的函數,包括("activity",False)

from copy import deepcopy
from collections import OrderedDict

def make_dict_list() -> list:
    """returns list of [OrderedDict for each list of (key, value) pairs]"""
    temp = OrderedDict()

    A0 = [('name', 'pageshift'), ('value', ''), ('activity', 'dataupdate'),
          ('host_name', False), ('db_name', True)]

    A1 = [('name', 'bigdata'), ('value', ''), ('activity', 'freeze'),
          ('host_name', False), ('db_name', True)]

    A2 = [('name', 'spark'), ('value', ''), ('activity', 'dataupdate'),
          ('host_name', False), ('db_name', True)]

    A3 = [('name', 'django'), ('value', ''), ('activity', 'insert'),
          ('host_name', False), ('db_name', True)]

    A4 = [('name', 'pageshift'), ('value', ''), ('activity', False),
          ('host_name', False), ('db_name', True)]

    mydicts = [A0, A1, A2, A3, A4]

    results = []

    for dictsets in mydicts:
        for pair in dictsets:
            temp[pair[0]] = pair[1]
        results.append(deepcopy(temp))   #load list with OrderedDict, clear & reload
        temp.clear()

    return results

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM