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

用于识别和修改序列的Python列表理解,python,list-comprehension,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中的列表理解,但是很难从这

我有一个方法,它迭代一个数字列表,识别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中的列表理解,但是很难从这个特殊的例子开始。使用列表理解可以做到这一点吗?

您可以尝试以下方法

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
我已经调整了您迭代的范围,为条件添加了一些对称性,并利用了您实际上不需要检查
数组[I]
的值这一事实;如果它是0,那么不管怎样,显式地将新值设置为0也没有坏处


不过,这并不像原来的循环那样清晰,不必要地创建一个全新的列表,而不是只在必要时修改原来的列表

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
我已经调整了您迭代的范围,为条件添加了一些对称性,并利用了您实际上不需要检查
数组[I]
的值这一事实;如果它是0,那么不管怎样,显式地将新值设置为0也没有坏处


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

从给出的注释和建议来看,我的原始代码似乎是执行该过程的最简单、也许也是最有效的方法。无需进一步回答。

从给出的评论和建议来看,我的原始代码似乎是执行该过程最简单、也许也是最有效的方法。不需要进一步的回答。

不是每件事都应该是理解。但是,如果您希望遭受折磨:

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]
然后


不是每件事都应该是一种理解。但是,如果您希望遭受折磨:

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]
然后


当你说“规范化”时,你的意思是将值设置为零?这样两个零之间的值变为零?是的,这是正确的。你写的代码没有任何问题。您可以使用迭代器、
next
zip
和列表理解来执行某些操作,但这将更加复杂。并非所有
for
循环都可以(或应该)转换为列表理解。在这种情况下,您不仅仅是对列表中的每个元素应用一个公共表达式;您正在根据列表中的元素上下文修改该元素。这个
for
循环比您可能想到的任何列表理解都要好得多。当您说
normalize
时,您的意思是将值设置为零?因此两个零之间的值变为零?是的,这是正确的。您编写的代码没有任何错误。您可以使用迭代器、
next
zip
和列表理解来执行某些操作,但这将更加复杂。并非所有
for
循环都可以(或应该)转换为列表理解。在这种情况下,您不仅仅是对列表中的每个元素应用一个公共表达式;您正在根据列表中的元素上下文修改该元素。这个
for
循环比你可能想到的任何列表理解都要好得多。这不是切掉了第一个和最后一个元素吗?也许要修复的切片分配:
array[1:-1]=…
我同意,这看起来比我原来的代码更难阅读。我希望有更优雅、更高效的方法,因为我有6种这样的方法,它们可以在我的时间序列列表数据中寻找连续的模式。是的,忘记处理边缘情况了。我会解决的。这不是切掉了第一个和最后一个元素吗?也许要修复的切片分配:
array[1:-1]=…
我同意,这看起来比我原来的代码更难阅读。我希望有更优雅、更高效的方法,因为我有6种这样的方法,它们可以在我的时间序列列表数据中寻找连续的模式。是的,忘记处理边缘情况了。我来修理。