嵌套的Python列表理解

时间:2013-10-17 20:54:28

标签: 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],

它会运行,但它会返回此结果:['c', 'c', 'd', 'd']

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

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

3 个答案:

答案 0 :(得分: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中的内容是可以播放的,那么将其设为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循环的方式相同。

答案 1 :(得分:2)

尝试

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

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

答案 2 :(得分:2)

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

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