簡體   English   中英

根據另一個字典列表中的鍵值刪除字典

[英]Delete a dictionary based on the value of a key in another list of dictionaries

我有一個字典清單和一本主要字典。 詞典列表具有以下格式。 為值分配一個在程序中動態變化的變量。

list_dict = [{'url': url_value , 'title' : title_value}, {'url': url_value , 'title' : title_value}]

main_dict = {"execution_time": "2017-06-05", "target_url": "http://www.bloomberg.com", "data": [{ "url" : url1}, { "url" : url2}], "name": "Michael", "occupation": "software"}

如果main_dict中數據下的任何url值(url1或url2)與list_dict中任何詞典中的url_value相同,我想從數據中刪除該詞典。

輸出:假設url_value為url1,則:

main_dict = {"execution_time": "2017-06-05", "target_url": "http://www.bloomberg.com", "data": [{ "url" : url2}], "name": "Michael", "occupation": "software"}

我考慮過使用dict理解,但是我嘗試的所有方法都沒有用。 我將很高興有一個起點或任何指導。

這應該可以解決問題:

my_list = [list_dict_data['url'] for list_dict_data in list_dict]
delete_list = []

for i in range(len(main_dict['data'])):
  if main_dict['data'][i]['url'] in my_list:
    delete_list.append(i)

for i in delete_list:
  del main_dict['data'][i]

所以它的作用是:

  1. 列出所有要從list_dict檢查的URL
  2. 遍歷主字典中的所有URL,並將其與list_dict中的數據進行比較
  3. 將索引添加到刪除列表
  4. 遍歷刪除列表並刪除main_dict中的相應索引

嘗試對其進行優化,因為它確實很粗糙。

您可以嘗試以下方法:

>>> list_dict = [{'url': "url1" , 'title' : "title_value1"}, {'url': "other_url" , 'title' : "title_value2"}]
>>> main_dict = {"execution_time": "2017-06-05", "target_url": "http://www.bloomberg.com", "data": [{ "url" : "url1"}, { "url" : "url2"}], "name": "Michael", "occupation": "software"}
>>> S = set(d["url"] for d in list_dict)
>>> main_dict["data"] = [d for d in main_dict["data"] if d["url"] not in S]
>>> main_dict
{'execution_time': '2017-06-05', 'target_url': 'http://www.bloomberg.com', 'data': [{'url': 'url2'}], 'name': 'Michael', 'occupation': 'software'}

代替刪除main_dict["data"]元素,想法是重新創建沒有匹配URL的列表:

  • 提取S list_dict的不同網址;
  • 根據規則過濾main_dict["data"]的字典dd["url"] not in S

命名注意:請嘗試根據內容而不是類型來命名變量。

  • list_dict是詞典列表(我可以看到),但是我想立即知道這些詞典中的內容。 如果您接受url +標題構成頁面,則web_pages會更好。 但是您應該指定為什么這些頁面在此列表中(例如dead_link_pages或其他)
  • main_dict是一本字典(很明顯,但不是很main_dict ):像task這樣的東西更好。 同樣,更好的規范是update_taskupdate_taskretrieve_task update_task
  • 好的,我用page_urls代替S

看看,這更具可讀性:

>>> web_pages = [{'url': "url1" , 'title' : "title_value1"}, {'url': "other_url" , 'title' : "title_value2"}]
>>> task = {"execution_time": "2017-06-05", "target_url": "http://www.bloomberg.com", "data": [{ "url" : "url1"}, { "url" : "url2"}], "name": "Michael", "occupation": "software"}
>>> page_urls = set(p["url"] for p in web_pages)
>>> task["data"] = [t for t in task["data"] if t["url"] not in page_urls]
>>> task
{'execution_time': '2017-06-05', 'target_url': 'http://www.bloomberg.com', 'data': [{'url': 'url2'}], 'name': 'Michael', 'occupation': 'software'}

暫無
暫無

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

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