[英]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.