有几次,当我需要根据某些条件从列表两端删除一些元素时,我遇到了一个问题。例如,假设我想从列表两端删除元素,只要遇到第一个 0(包括第一个 0),就从位置 q
开始删除元素。
示例:
mylist = [1,1,0,1,0,1,2,3,1,5,1,3,1,0,2]
应该变成:
[1,2,3,1,5,1,3,1]
如果我们将q
视为7。那么,我们转到第7个元素,开始向左移动,当遇到第一个0时,我们记住索引i0
并剪切它关闭mylist = mylist[i0+1:]
。对右侧重复相同的过程。
使用这个逻辑,我用两个循环完成了它,正如上面描述的那样。但似乎有点绕。有没有更简单的方法来处理这样的任务?
最佳答案
就我个人而言,我具体执行此操作的方法是向后查找零,然后返回索引并正确调整它以引用回原始列表。我担心这可能不是很清楚,所以让我向您展示我在代码中的意思:
zero = lambda l: next(i for i,v in enumerate(l) if v==0)
ending_zero = q + zero(mylist[q:])
starting_zero = q - zero(mylist[:q:-1])
return mylist[starting_zero:ending_zero]
或者将其包装在一个函数中并添加一些一般要求(不一定只等于零)
def two_directional_slice(original, condition, q):
condition = lambda l: (i for i,v in enumerate(l) if condition(v)).next()
ending_condition = q + condition(mylist[q:])
starting_condition = q - condition(mylist[:q:-1])
return mylist[starting_condition:ending_condition]
由于它惰性地评估条件,我认为使用它通常比迭代一次更好,但在最坏的情况下,这将恰好迭代您的列表一次。
为了彻底起见,以下是如何使用最后一个实现来解决第一个问题:
return two_directional_slice(mylist, lambda x: x==0, 7)
关于python - 根据条件切割列表尾部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759703/