将列表中的错误值替换为另一个列表中相同索引处的值

时间:2014-07-21 22:33:05

标签: python list

我有两个列表,分别是zw

z = [323, 493, 245, 542, 352, 463, 352]
w = [300, -9999, 4343, 320, -9999, -9999, -9999]

现在,我需要通过将所有w替换为相应的-9999值来更新z的值。如果我打印w,则值为

w = [300, 493, 4343, 320, 352, 463, 352]

这是我对代码的了解:

w[w == -9999] = z

但是我得到了

w = [[300, 493, 4343, 320, 352, 463, 352], -9999, 4343, 320, -9999, -9999, -9999]

4 个答案:

答案 0 :(得分:7)

z = [323, 493, 245, 542, 352, 463, 352]
w = [300, -9999, 4343, 320, -9999, -9999, -9999]

for index,value in enumerate(w):
    if value == -9999:
        w[index] = z[index]

输出

[300, 493, 4343, 320, 352, 463, 352]

同样的想法可以在列表理解中应用

>>> [z[index] if value == -9999 else w[index] for index, value in enumerate(w)]
[300, 493, 4343, 320, 352, 463, 352]

答案 1 :(得分:6)

这是在评估行时代码中发生的事情:

w[w == -9999] = z
w[False] = z      # w is a list, so isn't equal to -9999
w[0] = z          # False == 0

因此,您将w中的第一个(第0个)元素替换为z引用的列表。

相反,我认为你想要:

w = [z_val if w_val == -9999 else w_val
     for w_val, z_val in zip(w, z)]

list comprehension使用zip built-in function来迭代wz中的项目对,这是{{3}}。

答案 2 :(得分:2)

由于没有真正的理由迭代两个列表或将它们压缩在一起,你可以这样做 - 它的速度更快:

def replace_values(w, z):
    return [z[num] if x == -9999 else x for num, x in enumerate(w)]

答案 3 :(得分:0)

您可以使用map来执行此操作:

>>> z = [323, 493, 245, 542, 352, 463, 352]
>>> w = [300, -9999, 4343, 320, -9999, -9999, -9999]
>>> map(lambda t: t[0] if t[1]==-9999 else t[1], zip(z,w))
[300, 493, 4343, 320, 352, 463, 352]

Numpy也很自然:

>>> import numpy as np
>>> z = np.array([323, 493, 245, 542, 352, 463, 352])
>>> w = np.array([300, -9999, 4343, 320, -9999, -9999, -9999])
>>> idx=np.where(w==-9999)
>>> w[idx]=z[idx]
>>> w
array([ 300,  493, 4343,  320,  352,  463,  352])