使用函数式编程概念:
>>> my_list = ['hello', 'there', '', 'I', 'try', '', 'to', 'be', 'helpful']
>>> my_list = filter(lambda a: a != '', my_list)
>>> my_list
['hello', 'there', 'I', 'try', 'to', 'be', 'helpful']
我对各种各样的答案很感兴趣,所以我进行了一些比较。
import time
num_trials = 1000000
my_list = ['a', 'b', '', 'c', '', 'd']
start = time.time()
for i in xrange(num_trials):
[x for x in my_list if x != '']
end = time.time()
list_comp = (end - start) / num_trials
start = time.time()
for i in xrange(num_trials):
filter(lambda a: a != '', ['a', 'b', '', 'c', '', 'd'])
end = time.time()
functional = (end - start) / num_trials
print "Over {0} trials...".format(num_trials)
print "Using list comprehension, the average time to execute was {0}".format(list_comp)
print "Using filter and lambda, the average time to execute was {0}".format(functional)
#Over 1000000 trials...
#Using list comprehension, the average time to execute was 2.03965497017e-06
#Using filter and lambda, the average time to execute was 3.60413718224e-06
因此,列表理解似乎稍微快一些,至少对于我测试的列表而言。
编辑:我很抱歉!列表推导使用的是预分配列表my_list,而我让 lambda+filter 表达式每次都为一个新列表分配内存!我还对作者接受的答案filter(None, my_list) 进行了测试。该代码如下所示:
start = time.time()
for i in xrange(num_trials):
filter(None, my_list)
end = time.time()
filter_none = (end - start) / num_trials
而新的输出是:
#Over 1000000 trials...
#Using list comprehension, the average time to execute was 1.80612707138e-06
#Using filter and lambda, the average time to execute was 2.1211681366e-06
#Using filter(None), the average time to execute was 1.11886692047e-06
所以,filter(None, some_list) 似乎拿走了蛋糕!