python - 根据条件切割列表尾部

标签 python list slice

有几次,当我需要根据某些条件从列表两端删除一些元素时,我遇到了一个问题。例如,假设我想从列表两端删除元素,只要遇到第一个 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/

相关文章:

python - 你能为一个变量使用多个 elif 吗?

python - 从列表中删除某些特定元素之前的元素

python - 在Python中对列表进行切片

arrays - 如何在 Go 中获取 slice 的底层数组?

Django 模板 : smartly slice the HTML content

python-crontab 在 django 请求中请求特权用户

Python - 同情 : how to compute lie derivative

C#字典以列表为值,可以直接对列表进行操作吗?

c# - 无法将扩展类转换为 IList

python - 从数组绘制直方图