2

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

4

6 回答 6

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

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

于 2013-10-13T21:51:36.330 回答
3

您可以执行以下操作:

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]
于 2013-10-13T22:10:43.673 回答
1

编辑:我更喜欢这种方法:

def trim(lst, key=lambda i:i==0):
  g = [(k,list(group)) for k, group in groupby(lst, key=key)]
  if g[0][0]: del g[0]
  if g[-1][0]: del g[-1]
  return list(chain.from_iterable(group[1] for group in g))

原来的:

使用 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)
于 2013-10-13T22:13:07.910 回答
0

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

于 2013-10-13T21:52:00.230 回答
0
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]
于 2013-10-13T21:53:02.057 回答
0

可能不是最有效的,但一种方法是

>>> 我的列表
[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]
于 2013-10-13T21:53:32.230 回答