我如何创建一个列表,如果列表a的一行中的a[0]或a[1]不存在于列表b的任何行中,列表a中的行被附加到列表c中



我有一个列表a eg:

a = [[1, 3, 7], [3, 5, 7], [-23, -34, -45]]

和另一个列表b例如:

b = [1, 2, 3, 4]

我想创建一个列表c,其中当列表a单行的前两列中的项目不存在于列表b中时,行a被附加到列表c中。在示例中,列表c看起来像:

c = [[7], [7], [-45]]

作为a的第一行包含1和3,它们都存在于b中,第二行包含3,它们存在于b中。

我尝试了以下操作,但没有成功:

for row in a:
    if row[0] or row[1] not in b:
        c.append(a)

for row in a:
    if row[1] not in b:
        if row[0] not in b:
            c.append(a)

因为两者似乎只是将a复制到b

有谁知道为什么我的代码不工作/代码,而不是?

编辑:抱歉,我第一次得到了我预期的结果错误

我把事情搞砸了——我的设计完全错了,我的输入列表来自另一个来源,我把它们抄错了。因此,我实际要做的是如下所示
c = [ ]
a = [[1, 3, -23], [3, 5, -34], [7, 7, -45]]
b = [1, 2, 3, 4]
for row in a:
    if row[0] not in b and row[1] not in b:
        c.append(row)

感谢所有帮助我的人。对不起,我真是个白痴。

对@muzulget答案的稍微修改:

for row in a:
    if row[0] not in b or row[1] not in b:
        c.append(a[2])

可能条件不对?

for row in a:
    if row[0] not in b or row[1] not in b:
        c.append(a)

row[0]是true,如果非零,那么为什么总是复制a到b。

只使用setslist comprehensions:

[row[2] for row in a if set(b)-set(row[:2]) != set(b)] # prints [7, 7]

我会选择:

c = [row[2:] for row in a if row[0] in b or row[1] in b]

或,有集合:

b_set = set(b)
c = [row[2:] for row in a if not set(row[:2]).isdisjoint(b_set)]
测试:

>>> a = [[1, 3, 7], [3, 5, 7], [-23, -34, -45]]
>>> b = [1, 2, 3, 4]
>>> c = [row[2:] for row in a if row[0] in b or row[1] in b]
>>> print c
[7, 7]

似乎符合你在评论中的最后一个定义。虽然不确定它是正确的,但;)

最新更新