Python 缩短列表

Python 缩短列表,python,list,Python,List,我有一个简单的问题,我似乎找不到答案。我在python中有一个列表,我想根据末尾的值将其缩短。例如,假设我有list=[0,0,1,2,1,2,2,0,1,1,0]我想删除列表末尾或开头的任何0,因此这将转换为list=[1,2,1,2,2,2,0,1,1]。我尝试使用filter(),但这会在我只想删除端点时删除0的所有实例。我是python新手,似乎无法理解这一点。任何帮助都将不胜感激 while list[0] == 0: list.pop(0) while list[-1] ==

我有一个简单的问题,我似乎找不到答案。我在
python
中有一个
列表
,我想根据末尾的值将其缩短。例如,假设我有
list=[0,0,1,2,1,2,2,0,1,1,0]
我想删除列表末尾或开头的任何0,因此这将转换为
list=[1,2,1,2,2,2,0,1,1]
。我尝试使用
filter()
,但这会在我只想删除端点时删除0的所有实例。我是python新手,似乎无法理解这一点。任何帮助都将不胜感激

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

但是最好不要使用名为
list
的变量,因为它会覆盖内置的
list
类型。

您可以使用
pop
方法:
L.pop([index])->项
--删除并返回索引处的项(默认为最后一个)。 如果列表为空或索引超出范围,则引发索引器错误

In [88]: L = [0,0,1,2,1,2,2,2,0,1,1,10,0]

In [89]: s = ','.join(str(i) for i in L)

In [90]: while s[-2:] == ',0':
   ....:     s = s[:-2]
   ....:     

In [91]: while s[:2] == '0,':
   ....:     s = s[2:]
   ....:     

In [92]: [int(i) for i in s.split(',')]
Out[92]: [1, 2, 1, 2, 2, 2, 0, 1, 1, 10]
更好的是:

In [102]: L = [0,0,1,2,1,2,2,2,0,1,1,10,0]

In [103]: blacklist = set()

In [104]: mid = False

In [105]: for i,num in enumerate(L):      
    if not mid and not num:
        blacklist.add(i)
    elif num:
        mid = True

In [106]: mid = False

In [107]: for i,num in enumerate(reversed(L)):
    if not mid and not num:
        blacklist.add(len(L)-i)
    elif num:
        mid = True

In [108]: [num for i,num in enumerate(L) if i not in blacklist]
Out[108]: [1, 2, 1, 2, 2, 2, 1, 1, 10]

也许不是最有效的,但有一种方法是

>>> myList [0, 0, 1, 2, 1, 2, 2, 2, 0, 1, 1, 0] >>> [int(str_element) for str_element in "".join(str(int_element) for int_element in myList).strip('0')] [1, 2, 1, 2, 2, 2, 0, 1, 1] >>>迈利斯特 [0, 0, 1, 2, 1, 2, 2, 2, 0, 1, 1, 0] >>>[int(str_元素)表示“”中的str_元素。join(str(int_元素)表示myList中的int_元素。strip('0')] [1, 2, 1, 2, 2, 2, 0, 1, 1]
你可以这样做:

from itertools import takewhile
def list_strip(sequence, item):
    leading = sum(1 for el in takewhile(lambda L: L == item, sequence))
    trailing = sum(1 for el in takewhile(lambda L: L == item, reversed(sequence)))
    slc = slice(leading, -trailing or None)
    return sequence[slc]
编辑:我更喜欢这种方法: 原件: 使用itertools可以非常方便地处理左侧修剪,但是itertools对于列表的结尾并没有那么好

def ltrim(lst, v=0):
  return list(itertools.dropwhile(lambda i:i==v, lst))

def rtrim(lst, v=0):
  return reversed(ltrim(reversed(lst), v))

def trim(lst, v=0):
  return ltrim(rtrim(lst, v), v)

但是,第一个循环可能非常慢(如果开始时有几个零)。如有必要,可以对其进行优化:先计算前导零,然后
del list[:clz]
@delnan或
l=list(itertools.dropwhile(lambda x:x==0,l))
。但这不适用于两位数。更好:-)不过,我认为您不需要
.strip(',')
,因为
strip
将其参数视为一组字符。@DSM:很好。再也不能用一个衬里来处理了。查看update@inspectorG4dget虽然没有单行程序的便利,但我认为转换成字符串并返回可能不是计算的好方法。@Sammusmann:我同意。我确实注意到了这一点,并发布了一个更新,就像您发布了您的评论一样,但这不适用于多位数。例如,
[1002]
。我的错,对不起。我是否应该删除我的答案,因为@inspectorG4dget似乎也有同样的想法?如果我是一个赌徒,我会打赌这是最快的解决方案。不要调用列表
list
它会覆盖列表构造函数>:-(
def ltrim(lst, v=0):
  return list(itertools.dropwhile(lambda i:i==v, lst))

def rtrim(lst, v=0):
  return reversed(ltrim(reversed(lst), v))

def trim(lst, v=0):
  return ltrim(rtrim(lst, v), v)