繁体   English   中英

lstrip(),rstrip()用于列表

[英]lstrip(), rstrip() for lists

我有一堆带有整数的巨大列表。 这些列表可以以几个零开始或结束。

是否有一种简单的方法可以从列表中删除左侧或右侧的零? 类似于lstrip()rstrip()的字符串?

数据看起来像

[0,0,0,1,2,3,4]

要么

[1,2,3,4,0,0,0]

我必须能够单独使用lstrip()rstrip() 我不需要列表两边的条带。

你可以使用itertools.dropwhile()

>>> L = [0, 0, 1, 1, 2, 2, 0]
>>> list(itertools.dropwhile(lambda x: x == 0, L))
[1, 1, 2, 2, 0]

有一个比内置的itertools.dropwhile()更有效的解决方案。 您可以使用全能的collections.deque ,这将是此任务的理想数据结构,因为它的左或右popO(1) 这是左边的条纹,右边的条纹只是它的镜像:

from collections import deque

def noLeadingZero(l):
    d = deque(l)
    for e in l:
        if e == 0:
            d.popleft()
        else:
            break
    return list(d)

l = [0, 0, 1, 1, 2, 2, 0]
print(noLeadingZero(l))
# Result:
# [1, 1, 2, 2, 0]

让我们根据以下使用内置itertools.dropwhile()代码测试其性能:

from itertools import dropwhile
print(list(dropwhile(lambda x: x == 0, l)))

这是性能测试:

import timeit

print timeit.timeit(
setup= """from itertools import dropwhile
l = [0, 0, 1, 1, 2, 2, 0]""",
stmt="""list(dropwhile(lambda x: x == 0, l))""") #2.308

print timeit.timeit(
setup= """from collections import deque
l = [0, 0, 1, 1, 2, 2, 0]
def noLeadingZero(l):
    d = deque(l)
    for e in l:
        if e == 0:
            d.popleft()
        else:
            break
    return list(d)""",
stmt="""noLeadingZero(l)""") #1.684 -> Win!
l = ['10000', '000001']
map(lambda x: x.strip('0'), l)

>>> ['1', '1']

我猜你的列表包含整数的字符串? ['001','100']而不是[001,100]

[x.strip('0') for x in bigList]尝试[x.strip('0') for x in bigList] 请参阅python docs中的 str.split

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM