我有一堆带有整数的巨大列表。这些列表可以以几个零开始或结束。
是否有一种简单的方法可以从列表中删除左侧或右侧的零?
类似于lstrip()
或rstrip()
的字符串?
数据看起来像
[0,0,0,1,2,3,4]
或
[1,2,3,4,0,0,0]
我必须能够单独lstrip()
或rstrip()
。我不需要列表两边的条带。
答案 0 :(得分:9)
您可以使用itertools.dropwhile()
:
>>> L = [0, 0, 1, 1, 2, 2, 0]
>>> list(itertools.dropwhile(lambda x: x == 0, L))
[1, 1, 2, 2, 0]
答案 1 :(得分:1)
有一种比内置itertools.dropwhile()
更有效的解决方案。您可以使用全能collections.deque
,这是此任务的理想数据结构,因为其左侧或右侧pop
为O(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!
答案 2 :(得分:0)
l = ['10000', '000001']
map(lambda x: x.strip('0'), l)
>>> ['1', '1']
答案 3 :(得分:-1)
我猜你的列表包含整数的字符串?
与['001','100']
相比,[001,100]
相似?
试试[x.strip('0') for x in bigList]
。请参阅python docs中的str.split
。