我有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个以上的关键字时,由于某种原因,我会不断收到此错误。
答案 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)
如果您仅遍历每个单词,我认为这也会起作用。