我有一個包含不同值的串列和一個包含不同方程的字典。我想用for-loop遍歷串列值并計算給定的方程。示例如下:
list = [1,2,3,4,5]
d ={"equation1": 2*x 3,
"equation2": 3 4*x}
for x in list:
y= d["equation1"]
print(y)
輸出如下所示:
5
5
5
5
5
當我for像下面的示例一樣將字典放入回圈中時,會計算正確的值:
list = [1,2,3,4,5]
for x in list:
d ={"equation1": 2*x 3,
"equation2": 3 4*x}
y= d["equation1"]
print(y)
結果:
5
7
9
11
13
如何使用for-loop外的字典實作正確的結果?
uj5u.com熱心網友回復:
在你的第一個例子中:
list = [1,2,3,4,5]
d ={"equation1": 2*x 3,
"equation2": 3 4*x}
這只有在您x之前以某種方式定義時才有效,因此您可能沒有共享所有相關代碼。
像這樣的東西2*x 3會立即得到評估,所以如果x == 1,你會得到結果5,就像你建議的那樣。
您可以創建一個dictwithlambda運算式:
d ={"equation1": lambda x: 2*x 3,
"equation2": lambda x: 3 4*x}
但我不會推薦它作為好的代碼。如果你這樣做,這有效:
list = [1,2,3,4,5]
d ={"equation1": lambda x: 2*x 3,
"equation2": lambda x: 3 4*x}
for x in list:
y = d["equation1"](x)
print(y)
請注意該行是如何y = d["equation1"](x) x傳遞給訪問的函式的d["equation1"]- 一個 lambda 運算式是一個簡單的函式,而在dictexpect 一個引數中定義的那些。
更合適的解決方案是:
def equation1(x):
return 2*x 3
def equation2(x):
return 3 4*x
xs = [1,2,3,4,5]
for x in xs:
y = equation1(x)
print(y)
然后,如果您有理由dict從某處使用 a 來參考您的函式:
xs = [1,2,3,4,5]
funs = {
'equation1': equation1,
'equation2': equation2
}
for x in xs:
y = funs['equation1'](x)
print(y)
uj5u.com熱心網友回復:
您遇到的問題是運算式2*x 3和3 4*x不是您可以存盤在字典中的東西。相反,它們會立即計算,無論x是在創建字典時可用的值。他們不使用x稍后查找值時的值。
如果你想存盤一些代碼,比如那些運算式,以便稍后運行,在 Python 中實作它的自然方法是使用函式。該lambda關鍵字甚至可以讓您創建僅計算單個運算式的函式,這正是您想要的。
嘗試:
d = {"equation1": lambda: 2*x 3,
"equation2": lambda: 3 4*x}
for x in list:
d ={"equation1": 2*x 3,
"equation2": 3 4*x}
y = d["equation1"]() # note, here we're calling the lambda function
print(y)
其他一些注意事項:
為 使用與字典不同的容器可能是有意義的d,因為您的方程名稱似乎沒有太多意義。如果您只想按整數索引它們(例如,1而不是"equation1"),則串列是更自然的選擇。
此外,您的方程當前x可以從封閉的命名空間中自由選擇值。將x值作為引數傳遞給 lambda 函式可能更簡潔。Grismar 的非常好的答案涵蓋了如何為 執行此操作x,因此我不會給出任何多余的示例代碼。傳遞方程所需的值作為引數確實需要在呼叫代碼和方程之間建立更嚴格的“契約”,就像一個方程期望定義一個y或z變數一樣,你需要知道將它作為一個爭論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334488.html
下一篇:從輸入中獲取字典
