-1

我有一个列表列表,a例如:

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)

因为两者似乎都复制ab

有谁知道为什么我的代码不起作用/代码会改为?

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

编辑 2:我搞砸了——我设计的全错了,我的输入列表来自另一个来源,我把它们复制错了。所以我真正想做的是如下

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)

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

4

4 回答 4

1

只需使用setslist comprehensions

[row[2] for row in a if set(b)-set(row[:2]) != set(b)] # prints [7, 7]
于 2013-04-18T15:40:19.423 回答
1

也许是错误的条件?

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

row[0]如果不为零,则为真,那么为什么总是将 a 复制到 b。

于 2013-04-18T15:43:44.710 回答
1

对@muzulget 的回答稍作修改:

for row in a:
    if row[0] not in b or row[1] not in b:
        c.append(a[2])
于 2013-04-18T15:51:46.577 回答
1

我会去:

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]

似乎符合您在评论中的最后一个定义。不确定这是不是正确的;)

于 2013-04-18T15:51:52.630 回答