Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向右压缩非零元素_Python_Python 2.7_Optimization - Fatal编程技术网

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

我在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.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表示法。元组是否也可能包含负值?