![](/img/trans.png)
[英]How to remove multiple (key,value) entries from a Python List - Ordered 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
方法可能更適合布爾值。 這將刪除所有OrderedDicts
與badpairs
列表中的任何對:
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.