2013-05-15 64 views
0

在Python中,我有一個列表,例如:從整數列表更改爲0和1之間的權重?

a = [1, 2, 3, 4, 5] 

名單將始終進行排序。我想分配權重值,使得僅重值在0和1之間去的最大值將有重量1,即在這個例子中,5將有重物1

然而,1不會有體重0(0是特殊的,不包括在內)。我希望所有其他權重都是最大數量的某個小數值。我不確定解決這個問題的最好方法是什麼。

回答

9

先找出最大;因爲你的數據是排序的,這將是最後一個值;然後只需通過該值除以休息:

from __future__ import division 

maxval = a[-1] 
weights = [elem/maxval for elem in a] 

演示:

>>> maxval = a[-1] 
>>> [elem/maxval for elem in a] 
[0.2, 0.4, 0.6, 0.8, 1.0] 

from __future__ import division進口,確保我們使用浮點除法,而不是整數除法。另一種方法是使用maxval = float(a[-1])

+0

非常感謝你......這工作完美。 – cooper

0
def makeWeightedList(list_): 
    max_ = max(list_) 
    newList = list(map(lambda value: value/max_, list_)) 
    return newList 

順便說一句,這工作,即使列表不排序。如果你真的可以依靠總是被排序的名單(按升序(或不降序)),最大永遠是最後一個元素,所以第二行可改爲:

max_ = list_[-1] 

這將有更好的性能。

+0

輸入*排序*,所以使用'max()'是矯枉過正;它必須遍歷'list_'中的所有值,而根據定義,最大值是最後一個元素。 –

+0

的確,現在我意識到了。期望你的列表總是被排序,這有點奇怪。 – Tespa42

+0

爲什麼這很奇怪?使用「bisect」模塊,您可以在插入O(log N)時間時保持列表排序。這使得按排序順序保持列表*容易*。 –

相關問題