我有两个列表,分别是z
和w
:
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]
答案 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来迭代w
和z
中的项目对,这是{{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])