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

时间:2019-07-30 00:47:43

标签: python python-3.x list

我有2个列表。名为“关键字”的列表是我手动创建的列表,名为“ mylist”的嵌套列表是脚本中具有的函数的输出。这是他们的样子:

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

mylist = [("Jack","Math and Physics"), 
          ("Bob","English"), 
          ("Emily","Physics"), 
          ("Mark","Gym and Spanish"),
          ("Brian", "Math and Gym"),
          ...]

我要尝试的是删除嵌套列表中的每个项目(如果该项目(用括号括起来)包含“关键字”列表中写入的关键字的 any )。

例如,在这种情况下,应将“ mylist”中包含单词“ Physics”或“ Spanish”的所有项目从“ mylist”中删除。然后,当我打印“ mylist”时,应该是输出:

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

我尝试通过Internet和许多其他SO帖子进行搜索以学习如何进行此操作(例如this),但是当我进行修改时(因为我有一个嵌套列表,而不仅仅是列表),代码并运行它,我得到以下错误:

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个以上的关键字时,由于某种原因,我会不断收到此错误。

4 个答案:

答案 0 :(得分:4)

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

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')]

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以先使用and拆分字段,然后查看每个人的键和字段之间的交集。例如,您可以想象这样的事情:

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')]

如果您注重速度,那么pandas可能会更有效地完成工作

答案 3 :(得分:1)

for x in keyword:
    for i in mylist:
        for w in i[1].split(' '):
            if w == x:
                mylist.remove(i)

如果您仅遍历每个单词,我认为这也会起作用。