【发布时间】:2017-05-06 14:03:02
【问题描述】:
给定一个列表列表:
l = [[],[1,2,3],[1,2,3,4],[1,2],[3,1,4,2,0],[],[2]]
我通过以下方式从每个子列表中删除项目 2:
l = [[j for j in i if j !=2] for i in l]
有没有更快的方法来做同样的事情?
【问题讨论】:
标签: performance python-2.7 list
给定一个列表列表:
l = [[],[1,2,3],[1,2,3,4],[1,2],[3,1,4,2,0],[],[2]]
我通过以下方式从每个子列表中删除项目 2:
l = [[j for j in i if j !=2] for i in l]
有没有更快的方法来做同样的事情?
【问题讨论】:
标签: performance python-2.7 list
有趣的问题!
我尝试了 3 个不同的版本,并且(对于您的列表 - 不知道一般情况或一般情况)通过首先检查 2 是否在子列表中获得了微小(!)加速。我的尝试并不详尽:
from timeit import timeit
n_timeit = 1000
l = [[],[1,2,3],[1,2,3,4],[1,2],[3,1,4,2,0],[],[2]]
def f1(l):
return [[j for j in i if j != 2] for i in l]
def f2(l):
return [sublist if 2 not in sublist
else list(filter(lambda x: x != 2, sublist)) for sublist in l]
def f3(l):
return [sublist if 2 not in sublist
else [item for item in sublist if item != 2] for sublist in l]
t1 = timeit(setup='from __main__ import f1, l',
stmt='f1(l)',
number=n_timeit)
t2 = timeit(setup='from __main__ import f2, l',
stmt='f2(l)',
number=n_timeit)
t3 = timeit(setup='from __main__ import f3, l',
stmt='f3(l)',
number=n_timeit)
print(t1) # 0.00488
print(t2) # 0.00943
print(t3) # 0.00466
哦,在python3上测试过;不知道这在 python2 上的表现如何。
请注意您的方法和我的方法之间的区别:在您的方法中,无论如何您都会创建新列表;在我的中,您会得到对不包含 2 而不是新列表的列表的引用。
【讨论】: