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