列表理解:优雅地剥离和删除列表中的空元素

jsm*_*iao 3 python list-comprehension strip scrapy

我正在使用 Scrapy 库。我经常得到带有“\t”和“\n”的列表。

我试图使用列表理解来剥离和删除生成的空元素,但最终仍然是空元素。

有人可以解释一下解释器是如何处理代码的吗?它似乎正在检查空元素,然后剥离元素并将其重新插入列表中。

先感谢您!

# input
char_list = ['', '    a','b', '\t']
print char_list
char_list = [x.strip() for x in char_list if x!='']
print char_list

# output
['', '    a', 'b', '\t']
['a', 'b', '']

#DESIRED output
['', '    a', 'b', '\t']
['a', 'b']
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 5

通常在这种情况下,我会将其更改为两个步骤...在第一步中,我进行可能昂贵的处理。在第二步中,我进行过滤。第一步可以使用生成器表达式来完成,以避免不必要的列表:

char_list_stripped = (x.strip() for x in char_list)
char_list = [x for x in char_list_stripped if x]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它可以让您不必调用x.strip实际需要次数的两倍(如果您将其全部打包到一个推导式中)。这可能并不算巨大的节省(您可能不会注意到速度差异)。但在更一般的情况下,它可能会产生显着的差异,具体取决于处理实际需要多少工作。