我有一个以下结构的嵌套列表:
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']
发生了什么,以及如何解决这个问题?
注意:我知道这可以通过追加来完成,但我宁愿避免这种情况,因为我将使用大文件。
答案 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']]