在Python中对列表应用if-else一行程序

在Python中对列表应用if-else一行程序,python,Python,我有一个数组y,它的值为0或1。然后我有一个数组yp,它取0到1之间的值。这两个数组的长度相同 如果y中的条目为1,则我希望将相应的yp附加到列表中,否则我希望附加1-yp: y = [1,1,1,0,0] yp = [0.1, 0.2, 0.3, 0.4, 0.5] x = [] for idx, i in enumerate(y): if i: x.append(yp[idx]) else: x.append(1-yp[idx]) 有没有

我有一个数组
y
,它的值为0或1。然后我有一个数组
yp
,它取0到1之间的值。这两个数组的长度相同

如果
y
中的条目为1,则我希望将相应的
yp
附加到列表中,否则我希望附加
1-yp

y  = [1,1,1,0,0]
yp = [0.1, 0.2, 0.3, 0.4, 0.5]

x = []
for idx, i in enumerate(y):
    if i:
        x.append(yp[idx])
    else:
        x.append(1-yp[idx])

有没有一种用Python编写的更短的方法,也许没有for循环?

如果我理解正确的话,也许您正在寻找类似的东西

for idx, i in enumerate(y):
    x.append(yp[idx]) if i else x.append(1-yp[idx])
更像是三元操作方法


参考资料:

您要求理解列表(您称之为“一行”?),例如:

y  = [1,1,1,0,0]
yp = [0.1, 0.2, 0.3, 0.4, 0.5]
l=[yp[i] if y[i]==1 else 1-yp[i] for i in range(len(y))]
我会给你:

>>> l
[0.1, 0.2, 0.3, 0.6, 0.5]

您可以使用列表理解同时迭代两个列表:

>>> y  = [1,1,1,0,0]
>>> yp = [0.1, 0.2, 0.3, 0.4, 0.5]
>>> [b if a else 1 - b for a, b in zip(y, yp)]
[0.1, 0.2, 0.3, 0.6, 0.5]

如果列表很长,有一种更有效的方法使用numpy:

y,yp=map(np.asarray,(y,yp)#转换为数组
x=y*yp+(1-y)*(1-yp)
上述代码解释如下:

  • a=y*yp
    :生成与
    y
    (和
    yp
    )长度相同的数组,其中
    1*yp
    ,其中
    y=1
    0
    ,其中
    y=0
  • b=(1-y)*(1-yp)
    :生成一个具有
    1-yp
    的数组,其中
    y=0
    0
    其中
    y=1
  • a+b
    是成对的和,并产生您的预期结果