删除Python列表中的所有尾随零

时间:2015-04-10 23:49:41

标签: python list

有没有比这更快的删除零的方法:

while L[-1] == 0:
    L.pop(-1)

任何预建的功能或类似的东西?

3 个答案:

答案 0 :(得分:4)

三种可能的微观优化:

<强> 1。如果您希望 按索引删除项目,请使用del my_list[index]代替mylist.pop(index)

稍快一点:

import dis
def del_by_pop(mylist):
    mylist.pop(-1)

def del_by_del(mylist):
    del mylist[-1]

使用dis module,我们可以看看下面发生了什么。

dis.dis(del_by_pop)打印以下内容:

  2           0 LOAD_FAST                0 (mylist)
              3 LOAD_ATTR                0 (pop)
              6 LOAD_CONST               2 (-1)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 POP_TOP
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE

dis.dis(del_by_del)打印以下内容:

  2           0 LOAD_FAST                0 (mylist)
              3 LOAD_CONST               2 (-1)
              6 DELETE_SUBSCR
              7 LOAD_CONST               0 (None)
             10 RETURN_VALUE

del的工作量较少,因为它不需要返回弹出的项目。

<强> 2。使用for循环而不是while循环。

def del_for(mylist):
    for i in reversed(mylist):
        if not i:
            del mylist[-1]
        else:
            break

第3。根本不要使用del,只需在找到最后一个非零项目的位置后对列表进行切片

def del_for(mylist):
    for i, j in enumerate(reversed(mylist)):
        if j:
            mylist = mylist[:-1*i]
            break

答案 1 :(得分:1)

使用del并删除一次:

# rstrip_list.py

def rstrip(L, hit):
    while L[-1] == hit:
        L.pop(-1)

def fast_rstrip(L, hit):
    for i in xrange(len(L) - 1, -1, -1):
        if L[i] != hit:
            break
    del L[i + 1:]

import cProfile

L1 = range(1, 1000000) + [0] * 10000
L2 = range(1, 1000000) + [0] * 10000

cProfile.run('rstrip(L1, 0)')
cProfile.run('fast_rstrip(L2, 0)')

结果:

$ python rstrip_list.py

         10003 function calls in 0.004 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.004    0.004 <string>:1(<module>)
    1    0.003    0.003    0.004    0.004 rstrip_list.py:5(rstrip)
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    10000    0.001    0.000    0.001    0.000 {method 'pop' of 'list' objects}


         4 function calls in 0.001 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.001    0.001 <string>:1(<module>)
        1    0.001    0.001    0.001    0.001 rstrip_list.py:10(fast_rstrip)
        1    0.000    0.000    0.000    0.000 {len}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

答案 2 :(得分:-3)

我认为L是一个列表或一个字符串。您可以使用:

L = ''.join(L).rstrip('0')