嵌套Python列表理解

嵌套Python列表理解,python,list,list-comprehension,Python,List,List Comprehension,我有以下结构的嵌套列表: nested = [["a","b"], ["c", "d"]] 现在我想继续使用这个结构,但是如果元素属于另一个列表,就删除它们。 假设这个列表是stoplist=[“a”,“z”] 因此,结果将是: [["b"], ["c", "d"]] 我希望我错过了一件简单的事情,但在这种情况下,我似乎无法理解列表: [letter for letter in List if letter not in stoplist for List in nested], 它运行

我有以下结构的嵌套列表:

nested = [["a","b"], ["c", "d"]]
现在我想继续使用这个结构,但是如果元素属于另一个列表,就删除它们。 假设这个列表是
stoplist=[“a”,“z”]

因此,结果将是:

[["b"], ["c", "d"]] 
我希望我错过了一件简单的事情,但在这种情况下,我似乎无法理解列表:

[letter for letter in List if letter not in stoplist for List in nested],
它运行,但它返回以下结果:
['c','c','d','d']

到底发生了什么,如何解决

注意:我知道这可以通过append完成,但我更愿意避免这种情况,因为我将处理大文件。

可能类似于

>>> nested = [["a","b"], ["c", "d"]]
>>> stoplist = ["a", "z"]
>>> [[letter for letter in sublist if letter not in stoplist] for sublist in nested]
[['b'], ['c', 'd']]
虽然如果
停止列表中的内容是可散列的,但将其设置为
集合可能会更快(尽管很难猜测真正的小集合--
timeit
,并找出它是否重要)

您当前的listcomp可以解压缩到

newlist = []
for letter in List:
    if letter not in stoplist:
        for List in nested:
            newlist.append(letter)
这(让我困惑了几分钟)根本不应该起作用。它必须从以前的运行中拾取
列表

请注意,在列表中编写嵌套的顺序与编写等效嵌套for循环的顺序相同。

请尝试

[ [letter for letter in List if letter not in stoplist] for List in nested]

请注意,仅当嵌套的
嵌套的
深度为一层时,此操作才有效。

这里是另一个,将停止列表设置为一个集合,然后仅使用集合差异操作:

>>> stoplist = {'a', 'z'}
>>> [list(set(l)-stoplist) for l in nested]
[['b'], ['c', 'd']]

您可能想将
停止列表
转换为一个集合。结果的顺序重要吗?特别是,子列表的顺序重要吗?@kojiro是的,它是基本的。
>>> stoplist = {'a', 'z'}
>>> [list(set(l)-stoplist) for l in nested]
[['b'], ['c', 'd']]