Python真实性过滤列表

时间:2016-05-19 00:07:35

标签: python

我对python有点新,并且一直在处理像第一个列表这样的字符串列表,并且我希望将其过滤到仅仅是第二个中描述的真值。

l = ['value1', 'value2', '', None, 'value3']
l = ['value1', 'value2', 'value3']

我之前已经采用以下方式(最近的第二种方式)

new_l = filter(lambda x: x, l)
new_l = filter(bool, l)

这种解决方案有更多的pythonic方法吗?

2 个答案:

答案 0 :(得分:7)

如果第一个参数是None filter,则会自动删除在布尔上下文中评估为False的所有元素。我认为这是最pythonic的方法:

>>> filter(None, [1, 3, 0, 5, 3])
[1, 3, 5, 3]

摘自Python文档:

  

从iterable的那些元素构造一个列表,该函数返回true。 iterable可以是序列,支持迭代的容器,也可以是迭代器。如果iterable是字符串或元组,则结果也具有该类型;否则它总是一个列表。如果function为None,则假定为identity函数,即删除所有可迭代的false元素。

替代选项将是Python 2上的列表理解和Python 3上的生成器表达式。使用它们的好处是,无论您使用的是哪个Python版本,它们的行为都是相同的,而filter返回iterator在Python 3上而不是列表:

>>> l = [1, 3, 0, 5, 3]
>>> [x for x in l if x]
[1, 3, 5, 3]
>>> list(x for x in l if x)
[1, 3, 5, 3]

答案 1 :(得分:0)

不需要filter。使用列表理解

l = ['value1', 'value2', '', None, 'value3']
new = [element for element in l if element]

new
['value1', 'value2', 'value3']