Python 根据另一个列表中不存在的值过滤一个列表

Posted

技术标签:

【中文标题】Python 根据另一个列表中不存在的值过滤一个列表【英文标题】:Python filter one list based on values that do not exist in another list 【发布时间】:2016-12-12 00:23:27 【问题描述】:

尝试通过表 B 中未找到的 2 个值过滤表 A 的查询结果。正确的语法和方法是什么?

 import pyodbc
 MDB = 'C:/db/db1.mdb'; DRV = 'Microsoft Access Driver (*.mdb)'; PWD = 'pw'
 con = pyodbc.connect('DRIVER=;DBQ=;PWD='.format(DRV,MDB,PWD))
 cur = con.cursor()
 SQLA = 'SELECT * FROM TABLE1;' # your query goes here
 SQLB = 'SELECT * FROM TABLE2;' # your query goes here
 rows1 = cura.execute(SQLA).fetchall()
 rows2 = cura.execute(SQLB).fetchall()
 cur.close()
 con.close()
 for rit in rows1: 
     for git in rows2: 
        if (rit[1] and rit[2]) not in (git[1] and git[2]):
           print ((rit[1])  (rit[2]))

【问题讨论】:

这段代码有效吗?如果是这样,您是否要求改进?如果没有,是什么坏了? 不运行时它会打印出 TABLE1 中不应该出现的所有行。 我认为您需要将 ORDER BY 子句添加到您的选择语句中。此外,要使其工作在两个表中的前两列需要匹配 @BKCapri - 那么您是否只想列出TABLE1 中不存在于TABLE2 中的值对? (如果是这样,那么这不是“排序”,而是过滤器。) 我在 Table1 中的所有行之后,在 Table2 中找不到来自 Table1 的值对。 【参考方案1】:

只需使用熟悉的LEFT JOIN... IS NULL / NOT EXISTS / NOT IN 的纯SQL 解决方案即可。下面是等效查询,符合 MS Access,基于 col1col2 返回 TableA 中而不是 TableB 中的行。

左连接...为空

SELECT a.*
FROM TABLEA a
LEFT JOIN TABLEB b
ON a.col1 = b.col1 AND a.col2 = b.col2
WHERE b.col1 IS NULL AND b.col2 IS NULL

不存在

SELECT a.*
FROM TABLEA a 
WHERE NOT EXISTS 
  (SELECT 1 FROM TABLEB b
   WHERE a.col1 = b.col1 AND a.col2 = b.col2)

不在

SELECT a.*
FROM TABLEA a
WHERE a.col1 NOT IN (SELECT col1 FROM TABLEB)
AND a.col2 NOT IN (SELECT col1 FROM TABLEB)

【讨论】:

【参考方案2】:

Parfait 提供的 SQL 语句是首选解决方案,但如果您真的想使用双循环方法,则需要更像这样:

for rit in rows1:
    match_found = False
    for git in rows2: 
        if (rit[1] == git[1]) and (rit[2] == git[2]):
            match_found = True
            break
    if not match_found:
        print(rit)

【讨论】:

仍然返回了 row1 中的所有行。 @BKCapri - 检查rit[1]rit[2]git[1]git[2]返回的值;它们可能不是您认为的那样。 (这些行的索引将从零开始,因此rit 中的第一个元素是rit[0] 而不是rit[1]。) 糟糕,抱歉打错了,我的意思是 print(rit) 仍然返回 TABLE1 中的所有行 @BKCapri - 您的代码中一定还有其他错误。它对我来说很好。

以上是关于Python 根据另一个列表中不存在的值过滤一个列表的主要内容,如果未能解决你的问题,请参考以下文章

如果存在于列表中,则根据另一列的值选择列

根据 RECORD(repeated) 类型的列中不存在键来过滤 ROWs 列

根据包含必须过滤的索引的另一个列表拆分列表

如何根据列的值过滤 SQLAlchemy 结果?

根据另一个(部分)字典过滤字典列表

如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?