如果不在另一个列表中,则从一个列表中返回项

时间:2015-02-05 20:18:44

标签: python python-2.7 list-comprehension

如果该项目没有出现在我的任务列表Project中,我想从Task返回项目。我的代码只返回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']]

3 个答案:

答案 0 :(得分:2)

这就是诀窍:

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

但对于大型列表来说效率可能非常低。是时候重新考虑你的数据结构了!

答案 1 :(得分:0)

如果您可以假设项目名称始终位于任务的索引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']]

答案 2 :(得分:0)

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

(请注意,我更改了变量名称,使其与建议相符。)

此代码首先创建一组项目名称。检查集合中项目是否存在比列表中的项目便宜得多。