[英]Python list.remove items present in second list
我到处搜索,看到的大多数错误是人们尝试遍历列表并同时对其进行修改时看到的。 就我而言,我试图列出一个列表,并从该列表中删除第二个列表中存在的项目。
import pymysql
schemaOnly = ["table1", "table2", "table6", "table9"]
db = pymysql.connect(my connection stuff)
tables = db.cursor()
tables.execute("SHOW TABLES")
tablesTuple = tables.fetchall()
tablesList = []
# I do this because there is no way to remove items from a tuple
# which is what I get back from tables.fetchall
for item in tablesTuple:
tablesList.append(item)
for schemaTable in schemaOnly:
tablesList.remove(schemaTable)
当我在代码中放入各种打印语句时,一切看起来都正确并且可以正常工作。 但是当它到达实际的tablesList.remove(schemaTable)
我得到了可怕的ValueError: list.remove(x): x not in list
。
如果有更好的方法可以做到这一点,我欢迎您提出意见。 在我看来,遍历列表并删除项目似乎是合乎逻辑的。
提前致谢!
**编辑**
评论中的每个人和第一个答案都是正确的。 失败的原因是因为从元组到列表的转换创建了格式非常错误的列表。 因此,当尝试在下一个循环中删除项目时,没有任何匹配项。 解决此问题的方法是从每个元组中提取第一项,并将其放入列表中,如下所示: tablesList = [x[0] for x in tablesTuple]
。 完成此操作后,第二个循环便开始工作,并且正确删除了表名。
感谢您指出正确的方向!
我假设fetchall
返回元组,每个匹配的数据库行一个。
现在的问题是, tablesList
中的元素是元组,而schemaTable
包含字符串。 Python认为这些不相等。
因此,当您尝试使用schemaTable
的字符串在tablesList
上调用remove
时,Python无法找到任何这样的值。
您需要检查tablesList
的值,并找到一种将它们转换为字符串的方法。 我怀疑只是从元组中取出第一个元素就可以了,但是我手头没有mySQL数据库,因此我无法对其进行测试。
关于您的问题,是否有更好的方法可以:是。
除了将项目添加到列表中然后再将其删除之外,您可以仅添加所需的项目。 例如:
for item in tablesTuple:
if item not in schemaOnly:
tablesList.append(item)
另外,schemaOnly可以写为一个集合,以将搜索复杂度从O(n)提高到O(1):
schemaOnly = {"table1", "table2", "table6", "table9"}
这仅对于大型列表才有意义,但以我的经验来看,在语义上很有用。
最后,您可以将整个内容写成一个列表理解:
tablesList = [item for item in tablesTuple if item not in schemaOnly]
而且,如果您不需要保留重复(或者首先没有重复),也可以执行以下操作:
tablesSet = set(tablesTuple) - schemaOnly
在所有这些变体中,big-O的复杂性也最好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.