我有一个列表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。
只使用sets
和list 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]
似乎符合你在评论中的最后一个定义。虽然不确定它是正确的,但;)