根据另一个词典列表中的键值删除字典

问题描述 投票:0回答:2

我有一个词典列表和一个主词典。词典列表具有以下格式。为值分配一个在程序中动态更改的变量。

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理解,但是我尝试的一切都没有用。我希望得到一个起点或任何指导。

python python-2.7 dictionary dictionary-comprehension
2个回答
0
投票

这应该做的伎俩:

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. 迭代主dict中的所有url并将其与list_dict中的数据进行比较
  3. 将索引添加到删除列表中
  4. 迭代删除列表并删除main_dict中的相应索引

尝试优化它,虽然它真的很粗糙。


0
投票

你可以试试这个:

>>> 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"]的元素,想法是重新创建没有匹配网址的列表:

  • list_dict中提取S的不同网址;
  • 过滤d中的dicts main_dict["data"]规则:d["url"] not in S

关于命名的注意事项:尝试根据内容而不是类型命名变量。

  • list_dict是一个词典列表(我可以看到),但我想立即知道这些词典中的内容。如果你接受一个网址+一个标题制作一个页面,那么web_pages会更好。但是你应该说明这些页面在这个列表中的原因(例如dead_link_pages,或者其他)
  • main_dict是一本字典(很明显而且没有真正的信息):像task这样的东西更好。同样,更好的规范是提供信息的:update_taskretrieve_task,?
  • 好吧,我用S取代page_urls

看看,这更具可读性:

>>> 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'}
© www.soinside.com 2019 - 2024. All rights reserved.