2

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

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']

发生了什么,以及如何解决这个问题?

注意:我知道这可以通过附加来完成,但我宁愿避免这种情况,因为我将使用大文件。

4

3 回答 3

5

也许像

>>> 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']]

尽管如果其中的内容stoplist是可散列的,那么将其变为 a 可能会更快set(尽管对于非常小的集合很难猜测 -timeit并找出它是否重要)。

>>> stopset = set(stoplist)
>>> [[letter for letter in sublist if letter not in stopset] for sublist in nested]
[['b'], ['c', 'd']]

您当前的 listcomp 可以解压缩到

newlist = []
for letter in List:
    if letter not in stoplist:
        for List in nested:
            newlist.append(letter)

这(这让我困惑了几分钟)根本不应该真正起作用。它必须List从较早的运行中恢复。

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

于 2013-10-17T20:59:02.340 回答
2

尝试

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

请注意,这仅在nested嵌套一层深时才有效。

于 2013-10-17T21:05:02.980 回答
2

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

>>> stoplist = {'a', 'z'}
>>> [list(set(l)-stoplist) for l in nested]
[['b'], ['c', 'd']]
于 2013-10-17T21:39:18.123 回答