我对python有点新,并且一直在处理像第一个列表这样的字符串列表,并且我希望将其过滤到仅仅是第二个中描述的真值。
l = ['value1', 'value2', '', None, 'value3']
l = ['value1', 'value2', 'value3']
我之前已经采用以下方式(最近的第二种方式)
new_l = filter(lambda x: x, l)
new_l = filter(bool, l)
这种解决方案有更多的pythonic方法吗?
答案 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']