列表理解:优雅地删除并删除列表中的空元素

时间:2015-02-16 03:28:59

标签: python scrapy list-comprehension strip

我正在使用Scrapy lib。我经常使用'\ 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']

5 个答案:

答案 0 :(得分:4)

char_list = [x.strip() for x in char_list if x.strip()]

你想要的是删除无用的字符串。 X ="!"无法删除" \ t"。

答案 1 :(得分:4)

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

char_list_stripped = (x.strip() for x in char_list)
char_list = [x for x in char_list_stripped if x]

在这种情况下,它可以使您免于调用x.strip两次实际需要的次数(如果您要将其全部打包到一个单一的理解中)。这可能不是巨额储蓄(你可能不会注意到速度差异)。但在更一般的情况下,它可能会产生显着差异,具体取决于处理实际需要多少工作量。

答案 2 :(得分:2)

>>> char_list = ['', '    a','b', '\t']
>>> filter(None, map(str.strip, char_list))
['a', 'b']

答案 3 :(得分:2)

在蜘蛛中对这些东西进行硬编码并不是一个好习惯。看看Scrapy的built-in Item Loader和输入/输出处理器。 在REPL中尝试以下内容:

from  scrapy.contrib.loader.processor import MapCompose

def compact(s):
    """ returns None if string is empty, otherwise string itself """
    return s if s else None

char_list = ['', '    a','b', '\t']
MapCompose(unicode.strip, compact)(char_list)
=> ['a', 'b']

MapCompose按顺序对每个项应用给定的函数,每个函数将一个项作为参数,从将来的处理中排除None。

在items.py中使用此方法的最简单方法:

# -*- coding: utf-8 -*-
import scrapy
from  scrapy.contrib.loader.processor import MapCompose

def compact(s):
    return s if s else None

class MyItem(scrapy.Item):
    my_field = scrapy.Field(
        input_processor=MapCompose(unicode.strip, compact)
    )

在你的蜘蛛的parse_my_items回调中:

from scrapy.contrib.loader import ItemLoader
from myproject.items import MyItem

il = ItemLoader(item=MyItem())
il.add_value('my_field', char_list)
my_item = il.load_item()
yield my_item
#=> {'my_field': [u'a', u'b']}

希望这有帮助!

答案 4 :(得分:1)

双重理解比两次调用strip()

的单一理解更有效
char_list = [ x for x in [ x.strip() for x in char_list ] if x ]