繁体   English   中英

如果同一字典位于另一个列表中,如何删除列表中的字典(Python 2.7)

[英]How to delete a dictionary in a list, if the same dictionary is in another list (Python 2.7)

我有两个包含以下格式的相同字典的列表:

清单1:

[{'url': u'http://www.bloomberg.com/news/articles/2016-08-17/you-can-get-a-50-phone-from-amazon-if-you-don-t-mind-the-ads','title': u'You Can Get a $50 Phone From Amazon, If You Don\u2019t Mind the Ads'}, {'url': u'http://www.bloomberg.com/news/features/2016-08-18/uber-s-first-self-driving-fleet-arrives-in-pittsburgh-this-month-is06r7on', 'title': u'Uber\u2019s First Self-Driving Fleet Arrives in Pittsburgh This Month'}]

清单2:

[{'url': u'http://www.bloomberg.com/news/articles/2016-08-17/you-can-get-a-50-phone-from-amazon-if-you-don-t-mind-the-ads', 'title': u'You Can Get a $50 Phone From Amazon, If You Don\u2019t Mind the Ads'}]

我想做的事情:我想删除列表1中的字典(URL和标题),该字典也存在于列表2中。

我尝试了以下方法

list1[:] = [d for d in list1 if d.get('title') != (fail for fail in list2 if fail.get('title'))]

但无法做到

预期结果:

list1 = [{'url': u'http://www.bloomberg.com/news/features/2016-08-18/uber-s-first-self-driving-fleet-arrives-in-pittsburgh-this-month-is06r7on', 'title': u'Uber\u2019s First Self-Driving Fleet Arrives in Pittsburgh This Month'}]

只需做一个简单的比较:

>>> final = [i for i in one if i not in two]
>>> final
[{'url': u'http://www.bloomberg.com/news/features/2016-08-18/uber-s-first-self-driving-fleet-arrives-in-pittsburgh-this-month-is06r7on', 'title': u'Uber\u2019s First Self-Driving Fleet Arrives in Pittsburgh This Month'}]

然后,如果您确实需要,可以执行list1 = final

如果我理解正确,那么您希望list1仅包含其标题在list2中不存在的条目。 最好通过两步过程来完成此操作,以避免对list1每个元素重复进行list2线性扫描:

# Make a set of all titles defined by the dicts in list2
titles_in_list2 = {d['title'] for d in list2 if 'title' in d}

# Filter the contents of list1 to only items with titles not found in list2
list1[:] = [d for d in list1 if d.get('title') not in titles_in_list2]

注意:如果可以确保所有条目都定义了title键,则不需要第二个理解中的.get调用,也不需要第一个中的if检查。 .get将成为直接查找, d['title'] not in titles_in_list2 ,并且if 'title' in d检查d['title'] not in titles_in_list2 if 'title' in d将被完全删除。 您也不需要切片分配,除非可能存在对list1其他引用并且必须更改它。 如果这不是问题,可以使用list1 = [...]

Burhan Khalid的答案很完美。 万一您想要一个与您先前想法相符的解决方案,这里是:
list1 = [d for d in list1 if d.get('title') not in [f.get('title') for f in list2]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM