我有一个浮动列表,看起来像这样:
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语句中,我做错了什么?
答案 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;的回答。我找到了:
使用A[A<0.] = 0.
,&#34; tobias_k&#34;的做法是禁食。
我的方法花了大约两倍的时间。
使用if
- 语句和for
循环,#34; Miriam Farber&#34;的方法花费了大约50倍的时间。 (这也大致取决于内联min
循环中的max
,for
结构,这有点快:时间是最快选项的42倍。)