我有一个迭代一个数字列表的方法,并识别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 :(得分: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]