【发布时间】:2018-09-14 22:21:15
【问题描述】:
给定:
a = [[1,2],[3,4],[5,6],[7,8]]
b = 3
我想删除a 的第一项具有b 的项目。所以在这种情况下,我们将删除 [3,4] 给:
a = [[1,2],[5,6],[7,8]]
我当前的代码是:
if b in [i[0] for i in a]:
pos = [i[0] for i in a].index(b)
del a[pos]
这可行,但速度很慢。有什么更好的方法来做到这一点?
编辑: 我之前没有测试过性能,所以我可能做错了,但我明白了:
def fun1():
lst = [[x, 2*x] for x in range(1000000)]
lst = [x for x in lst if x[0] != 500]
return lst
def fun2():
lst = [[x, 2*x] for x in range(1000000)]
for i in reversed(range(len(lst))):
if lst[i][0] == 500:
del lst[i]
return lst
cProfile.runctx('fun1()', None, locals())
6 function calls in 0.460 seconds
cProfile.runctx('fun2()', None, locals())
6 function calls in 0.502 seconds
【问题讨论】:
-
“相当大”有多大?足够大,值得考虑重新排列代码,以便拥有一个 numpy 数组而不是列表?或者使用 PyPy 而不是 CPython?或者使用 Cython 构建一个快速的 C 扩展来执行 Coldspeed 的解决方案?
-
@abarnert 这在我的头上,但它不是那么大。
标签: python python-3.x list