[英]return items from one list if not in the other
如果该项目没有出现在我的任务列表Task
中,我想从Project
返回项目。 我的代码仅在Project
返回所有内容。 我究竟做错了什么?
Task = [['Task1','Project1',3],['Task2','Project4',6]]
Project = [['Project1', 'Andrew'],['Project2','Bob'],['Project3','Bob']]
not_in_list = [item for item in Project if item[0] not in Case]
print not_in_list
输出:
[['Project1', 'Andrew'], ['Project2', 'Bob'], ['Project3', 'Bob']]
预期结果:
[['Project2', 'Bob'],['Project3', 'Bob']]
这可以解决问题:
Task = [['Task1','Project1',3],['Task2','Project4',6]]
Project = [['Project1', 'Andrew'],['Project2','Bob'],['Project3','Bob']]
no_tasks = [p for p in Project if all(p[0] not in t for t in Task)]
print no_tasks
但对于大型列表而言,效率极低。 是时候重新考虑您的数据结构了!
如果可以假定项目名称始终位于Task的索引1中,则仅比前一个答案稍微有效。
>>> Task = [['Task1','Project1',3],['Task2','Project4',6]]
>>> Project = [['Project1', 'Andrew'],['Project2','Bob'],['Project3','Bob']]
>>> assigned = [t[1] for t in Task]
>>> [p for p in Project if p[0] not in assigned]
[['Project2', 'Bob'], ['Project3', 'Bob']]
task = [['Task1','Project1',3],['Task2','Project4',6]]
project = [['Project1', 'Andrew'],['Project2','Bob'],['Project3','Bob']]
task_projects = set(pr for _, pr, _ in task)
not_in_list = [item for item in project if item[0] not in task_projects]
print not_in_list
(请注意,我更改了变量名称,以便它们与建议匹配。)
此代码首先创建一组存在的项目名称。 检查集合中某个项目的存在比列表中的便宜得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.