Python 向右压缩非零元素
我在Python中有一个元组,包含一些非零元素Python 向右压缩非零元素,python,python-2.7,optimization,Python,Python 2.7,Optimization,我在Python中有一个元组,包含一些非零元素 a=(2,2,4,2,0,0,8,8,8,8,8) 我想要一种快速的方法,以列表的形式返回元组,左侧为零,但按顺序返回原始元素。到目前为止,我尝试了以下选项: def squeeze(v): v_filt=[x for x in v if x != 0] return [0]*(len(v)-len(v_filt))+v_filt def squeeze2(v): return sorted(v, key=numpy.s
a=(2,2,4,2,0,0,8,8,8,8,8)
我想要一种快速的方法,以列表的形式返回元组,左侧为零,但按顺序返回原始元素。到目前为止,我尝试了以下选项:
def squeeze(v):
v_filt=[x for x in v if x != 0]
return [0]*(len(v)-len(v_filt))+v_filt
def squeeze2(v):
return sorted(v, key=numpy.sign)
第一个选项稍微快一点,但仍然需要0.866秒来执行200000次长度为4的元组压缩(在cProfile上)。我的测试针对元组运行,其中每个元素可能为零,也可能不是
有什么方法可以让代码运行得更快吗?理想情况下,我希望将其改进至少一到两个数量级。如果您已经使用了numpy,则可以使用numpy进行掩蔽:
def squeeze(v):
c = v[v!=0]
return numpy.hstack([numpy.zeros(len(v)-len(c)),c])
编辑:由于श威尼च傲慢的
def squeeze(v):
result = [None] * len(v)
i = 0
j = len(v)-1
for x in range(len(v)):
if v[len(v)-x-1] == 0:
result[i] = 0
i += 1
else:
result[j] = v[len(v)-x-1]
j -= 1
return result
import time
import random
a = [random.randint(0,10) for r in xrange(200000)]
start_time = time.time()
squeeze(a)
print time.time() - start_time, "seconds"
这需要0.340382099152秒您的代码对我还不起作用-当我运行
a[a!=0]
时,我得到2。有什么我做得不对的吗a
如上所述。您必须提供一个numpy.array而不是元组。@Daniel如果要使用numpy,您应该使用numpy.zeros(len(v)-len(c))
,并且速度将提高一倍。不幸的是,这大约比OP的第一个解决方案慢4倍。(测试了11000000项)谢谢。不过所花的时间不是取决于机器吗。这将具有相同的大O表示法。元组是否也可能包含负值?