我正在按給定的數字對串列中的專案進行標準化,例如:
l = [79, 65, 42, 63, 48, 6, 44, 31, 22, 40, 3]
v = 79
l = [1.0, 0.8227848101265823, 0.5316455696202531, 0.7974683544303798, 0.6075949367088608, 0.0759493670886076, 0.5569620253164557, 0.3924050632911392, 0.27848101265822783, 0.5063291139240507, 0.0379746835443038]
為此,我使用了以下功能:
def normalize(l, n):
for i in l:
if n == 0:
l[l.index(i)] = 0
else: l[l.index(i)] = i/n
這適用于除一個串列/值組合之外的所有串列/值組合:
l =[48, 68, 30, 70, 83, 4, 58, 30, 27, 49, 1]
v = 83
l = [0.5783132530120482, 0.8192771084337349, 0.3614457831325301, 0.8433734939759037, 0.012048192771084338, 0.04819277108433735, 0.6987951807228916, 0.3614457831325301, 0.3253012048192771, 0.5903614457831325, 1]
在最后一個中,索引 4 和 10 的結果被切換,因此它呈現為好像 83/83= 0.012 和 1/83 = 1
現在 - 我已經通過回傳一個新串列而不是從全域范圍更改串列來解決問題,但是我沒有絲毫線索為什么會發生這種切換以及為什么它只影響這個實體。我認為可能是整數 30 在串列中出現了兩次,但是在將它的一次外觀更改為已經不在串列中的其他東西之后,切換仍然發生。
我對編碼還是很陌生,很想知道我做錯了什么!
uj5u.com熱心網友回復:
看起來您只想將串列中的每個元素除以某個變數,除非該變數為零,否則將元素設定為零。
如果是這種情況,那么一個簡單的串列理解將起作用:
l = [79, 65, 42, 63, 48, 6, 44, 31, 22, 40, 3]
v = 79
def normalise(l, v):
return [x / v for x in l] if v != 0 else [0.0] * len(l)
print(normalise(l, 0))
print(normalise(l, v))
輸出:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
[1.0, 0.8227848101265823, 0.5316455696202531, 0.7974683544303798, 0.6075949367088608, 0.0759493670886076, 0.5569620253164557, 0.3924050632911392, 0.27848101265822783, 0.5063291139240507, 0.0379746835443038]
筆記:
該函式將回傳一個新串列 - 即不會修改輸入串列
uj5u.com熱心網友回復:
Olvin 的回答向您展示了一種更加 Pythonic 的方式來實作您的目標。但是您還問“您做錯了什么”,所以我想為此發布答案。
在回圈程序中,您正在修改串列的內容。當您到達元素83時,您將其替換為值1。當您到達1串列末尾的值時,您呼叫l.index(1)以確定要更新串列的哪個成員。這將回傳第一個匹配元素的索引 - 現在是索引 4。這就是更新的內容。串列最后位置的值永遠不會被修改,所以保持不變1。
正如上面一位評論者所說,在迭代串列時修改串列的內容不是一個好習慣,而您的案例就是一個很好的例子。
我還要說,index()如果您可以使用更直接的方式訪問串列成員,您應該避免使用該方法。在這種情況下,如果我要使用顯式回圈,我會遍歷索引值,而不是串列中的專案:
def normalize(l, n):
for i in range(len(l)):
if n == 0:
l[i] = 0
else:
l[i] = l[i]/n
這將避免該問題,因為它不依賴項值來確定索引。
但同樣,顯示串列理解的另一個答案是在 Python 中處理此問題的更好方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432883.html
