2017-03-31 78 views
0

我有花車的列表,它看起來像這樣:重新編碼漂浮在列表

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較低的數字(因此所有負數)a 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

是'ratings_dec'的一個例子的' predictions_dec'? – doctorlove

+0

是的,忘了改變它.. – Lisadk

回答

5

您需要elif更換第二if

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

您的代碼將一些東西附加任何數字,大於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) 

您可以用列表comprehsenion

predictions_clean = [0.0 if x < 0 else (10 if x > 10 else x) for x in predictions_dec] 
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) 

編輯

的建議通過「tobias_k」當然是更好然後礦。但是爲了加入一些科學知識,我考慮了一個長度爲1,000,000的隨機列表/數組。我將上述實施方案與

A[A< 0.] = 0. 
A[A>10.] = 10. 

相比較,並與「Miriam Farber」的答案進行比較。我發現:

  1. A[A<0.] = 0.的方法,通過 「tobias_k」,要禁食。

  2. 我的方法花費了大約兩倍的時間。

  3. 該方法與if -statements和for循環,由「米里亞姆法伯」,花了大約50倍的時間。 (這也大致從min成立,max施工在直列for -loop,這是一個快一點:42倍一樣多的時間最快的選項)

+0

這不是循環整個數組_multiple_次? (雖然它可能在C中這樣做) –

+0

是的......但是使用編譯好的NumPy例程。對於大型陣列,這應該是一個很大的差異 –

+0

但是,如果使用像A [A> 10] = 10.0'和'A [A <0] = 0.0'這樣的東西會更容易嗎? –