Python 如果嵌套列表中的项包含关键字,如何删除该项?

Python 如果嵌套列表中的项包含关键字,如何删除该项?,python,python-3.x,list,Python,Python 3.x,List,我有两张清单。名为关键字的列表是我手动创建的列表,名为mylist的嵌套列表是脚本中的函数的输出。这就是它们的样子: keyword = ["Physics", "Spanish", ...] mylist = [("Jack","Math and Physics"), ("Bob","English"), ("Emily","Physics"), ("Mark","Gym and Spanish"), ("

我有两张清单。名为关键字的列表是我手动创建的列表,名为mylist的嵌套列表是脚本中的函数的输出。这就是它们的样子:

keyword = ["Physics", "Spanish", ...]

mylist = [("Jack","Math and Physics"), 
          ("Bob","English"), 
          ("Emily","Physics"), 
          ("Mark","Gym and Spanish"),
          ("Brian", "Math and Gym"),
          ...]
我试图做的是删除嵌套列表中的每个项目,如果括号中的项目包含关键字列表中写入的任何关键字

例如,在本例中,mylist中包含Physics或Spanish字样的任何项目都应从mylist中删除。然后,当我打印mylist时,这应该是输出:

[("Bob","English"), ("Brian", "Math and Gym")]
我尝试通过internet和许多不同的SO帖子来搜索,以了解如何执行此操作,例如,但是当我修改时,因为我有一个嵌套列表,而不是一个列表,因此我需要代码并运行它,我得到以下错误:

Traceback (most recent call last):
  File "namelist.py", line 165, in <module>
    asyncio.get_event_loop().run_until_complete(request1())
  File "C:\Users\XXXX\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 576, in run_until_complete
    return future.result()
  File "namelist.py", line 154, in request1
    mylist.remove(a)
ValueError: list.remove(x): x not in list
有人知道如何修复这个错误吗?你能分享你的代码吗


编辑:顺便说一句,我脚本中真正的mylist比我在这里写的要长得多,我有大约15个关键字。当我以这样的小规模运行它时,代码运行得很好,但由于某种原因,只要我有超过5个关键字,我就会不断出现这个错误。

您可以从使用和拆分字段开始,并查看每个人的键和字段之间的交点。例如,你可以想象这样的情况:

for key in keyword:
  for tup in mylist:
    [mylist.remove(tup) for i in tup if key in i]
new_list = []

for name,fields in mylist:
    # Convert the string into a set of string for intersection
    field_set = set(fields.split(" and "))
    field_in_keys = field_set.intersection(keyword)

    # Add in the new list if no intersection is found
    if len(field_in_keys) == 0:
        new_list.append((name,fields))
你会得到:

[('Bob', 'English'), ('Brian', 'Math and Gym')]

如果您关心速度,那么可能会更有效地完成这项工作

您可以将每个元组连接到一个字符串中,然后检查字符串中是否有关键字以过滤列表

newlist = [m for m in mylist if not any(k for k in keywords if k in ' '.join(m))]

print(newlist)
# [('Bob', 'English'), ('Brian', 'Math and Gym')]
对于关键字中的x: 对于mylist中的i: 对于i[1]中的w。拆分“”: 如果w==x: 迈利斯特·雷莫维
如果你只是循环遍历每个单词,我想这也行。

我假设你只关心元组中第二项中的任何单词是否是关键字,但你可能应该明确这一点。不过,这对于我的示例来说非常有效,我认为benvc的答案更可靠一点,因为它并不特别要求单词和出现在列表中。不过谢谢你的回答,投了赞成票!在这里,我更喜欢if not field_in_keys,而不是if lenfield_in_keys==0。