在Python列表中应用if-else一线

时间:2018-06-19 13:18:11

标签: 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])

是否有更短的方法用Python编写代码,也许没有for循环?

4 个答案:

答案 0 :(得分:3)

您可以将列表理解与zip一起使用,以同时遍历两个列表:

>>> 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]

答案 1 :(得分:2)

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

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

更像是三元运算法吗?

参考:http://book.pythontips.com/en/latest/ternary_operators.html

答案 2 :(得分:2)

如果您的列表很长,那么使用numpy会更有效:

y, yp = map(np.asarray, (y, yp)  # convert to an array
x = y * yp + (1 - y) * (1 - yp)

上面的代码解释如下:

  • a = y * yp:结果与y(和yp)长度相同的数组,其中1 * yp,其中y = 10,其中y = 0
  • b = (1 - y) * (1 - yp):产生一个数组,其中包含1-yp,其中y=00,其中y = 1
  • a + b是成对的总和,可以产生预期的结果。

答案 3 :(得分:1)

您正在要求列表理解(您称其为“单线”?),例如:

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]