用于识别和修改序列的Python列表解析

时间:2016-07-28 20:42:39

标签: python list-comprehension

我有一个迭代一个数字列表的方法,并识别0,非零,0的序列,然后将其中的值“规范化”为0。

这是我的代码:

for index in range(len(array)-2):
    if array[index] == 0 and array[index + 1] != 0 and array[index + 2] == 0:
        array[index + 1] = 0

这目前工作正常,我还有其他方法可以检测0,nz,nz,0等序列。

我一直在研究Python中的列表推导,但是无法确定从这个特定情况开始的位置。是否可以使用列表理解来完成此操作?

3 个答案:

答案 0 :(得分:2)

您可以尝试类似

的内容
new_array = [ 0 if (array[i-1] == array[i+1] == 0)
                else array[i]
                for i in range(1,len(array)-1) ]

# More readable, but far less efficient
array = array[0] + new_array + array[-1]

# More efficient, but less readable
# array[1:-1] = new_array

我已经调整了您迭代的范围,以便为条件添加一些对称性,并利用您不需要检查array[i]的值的事实;如果它为0,那么无论如何都明确地将新值设置为0都没有坏处。

尽管如此,这并不像原始循环那样清晰,并且不必要地创建一个全新的列表,而不是仅在必要时修改原始列表。

答案 1 :(得分:2)

根据给出的评论和建议,我的原始代码似乎是执行流程的最简单,也许是最有效的方式。没有必要进一步的答案。

答案 2 :(得分:-2)

并非一切都应该是一种理解。如果你想要折磨:

def f(a):
    [a.__setitem__(i + 1, 0) for i, (x, y, z) in enumerate(zip(a, a[1:], a[2:])) 
     if x == z == 0 and y != 0]

然后

>>> a = [1, 2, 0, 1, 0, 4]
>>> f(a)
>>> a
[1, 2, 0, 0, 0, 4]