用于识别和修改序列的Python列表理解
我有一个方法,它迭代一个数字列表,识别0、非零、0的序列,然后将中间的值“规格化”为0 这是我的密码:用于识别和修改序列的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中的列表理解,但是很难从这
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种这样的方法,它们可以在我的时间序列列表数据中寻找连续的模式。是的,忘记处理边缘情况了。我来修理。