重新编码列表中的浮动

时间:2017-03-31 14:41:35

标签: python if-statement floating-point

我有一个浮动列表,看起来像这样:

predictions_dec = [13.0, 8.6, 4.9, -1.5, 6.2, 7.7, 2.0, 10.0, 7.7, 12.7,...]

我想清理这些数据,方法是给出高于10.0的数字10.0和低于0.0的数字(所以所有负数)为0.0。我正在使用以下if语句执行此操作:

predictions_clean = []
for pred in predictions_dec:
    if pred >= 10:
        predictions_clean.append(10.0)
    if pred <= 0:
        predictions_clean.append(0.0)
    else:
        predictions_clean.append(pred)

这段代码似乎有效,但有趣的是:

len(predictions_dec) 
1222
len(predictions_clean)
1816

我对if语句的理解并不是那么好。在if语句中,我做错了什么?

3 个答案:

答案 0 :(得分:5)

您需要将第二个if替换为elif

predictions_clean = []
for pred in predictions_dec:
    if pred >= 10:
        predictions_clean.append(10.0)
    elif pred <= 0:
        predictions_clean.append(0.0)
    else:
        predictions_clean.append(pred)

答案 1 :(得分:1)

您的代码会为任何大于10.0的数字附加一些内容。

predictions_clean = []
for pred in predictions_dec:
    if pred >= 10: #e.g. 12, we append 10.0
        predictions_clean.append(10.0)
    if pred <= 0:
        predictions_clean.append(0.0)
    else:         #and now 12 is not less that 0, so append that
        predictions_clean.append(pred)

你想要elseif

predictions_clean = []
for pred in predictions_dec:
    if pred >= 10:
        predictions_clean.append(10.0)
    elif pred <= 0:
        predictions_clean.append(0.0)
    else:
        predictions_clean.append(pred)

您可以使用list comprehsenion

进行管理
predictions_clean = [0.0 if x < 0 else (10 if x > 10 else x) for x in predictions_dec]

答案 2 :(得分:0)

如果您的列表非常大(并且您希望避免循环和if语句),您还可以使用NumPy和数学技巧将每个负数设置为零:

A = .5*(A+np.abs(A))

你可以做同样的事情来把所有东西都设置得大到10到10.这里放的是一切:

import numpy as np

A = np.array([13.0, 8.6, 4.9, -1.5, 6.2, 7.7, 2.0, 10.0, 7.7, 12.7])

# set all items <= 0 to 0.0
A = .5*(A+np.abs(A))
print(A)

# set all items >= 10 to 10.0
A = 10.-A
A = .5*(A+np.abs(A))
A = 10.-A
print(A)

修改

&#34; tobias_k&#34;的建议当然比我好。但是为了加入一些科学,我考虑了一个长度为1,000,000的随机列表/数组。我将上述实现与

进行了比较
A[A< 0.] =  0.
A[A>10.] = 10.

和#34; Miriam Farber&#34;的回答。我找到了:

  1. 使用A[A<0.] = 0.,&#34; tobias_k&#34;的做法是禁食。

  2. 我的方法花了大约两倍的时间。

  3. 使用if - 语句和for循环,#34; Miriam Farber&#34;的方法花费了大约50倍的时间。 (这也大致取决于内联min循环中的maxfor结构,这有点快:时间是最快选项的42倍。)