我有這個串列串列,包含一系列值:
factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
我想將值中的每個 list1 相乘,但是將 list1 的相應元素相乘。我正在嘗試這樣做:
factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
multiply = []
for i in factors:
multiply = [values[i]*i]
但它不起作用。預期值為:
[[1, 2, 3], [6, 2, 8], [15, 15, 6]]
uj5u.com熱心網友回復:
試試這個:
factors = [1, 2, 3]
values = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
multiply = []
for idx, lst in enumerate(values):
multiply.append([factors[idx] * x for x in lst])
print(multiply)
有關上述代碼的串列理解版本,請參閱@Hommes 答案
uj5u.com熱心網友回復:
更新:鑒于問題的更一般設定,我改變了理解
串列理解的解決方案:
factors = [1, 2, 3]
values = [[1, 2, 3], [3, 1, 4], [5, 5, 2]]
multiply = [[factors[idx] * elem for elem in lst] for idx, lst in enumerate(values)]
Out[39]: [[1, 2, 3], [6, 2, 8], [15, 15, 6]]
uj5u.com熱心網友回復:
代碼有一些問題,因為它是:
Python 使用零索引
Python 中串列的第一個元素具有索引0。在你的 for 回圈中:
for i in factor:
multiply = [values[i]*i]
最后一次迭代將嘗試訪問values[3]. 但是values只有 3 個元素,所以最后一個元素是values[2],而不是 values[3]。
乘法*串列和一個整數實際上不乘
將一個串列乘以一個Int, sayn會給你一個連接原始n時間的新串列。例如:
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
在串列上實際廣播乘法的最直接方法是使用“串列理解”。例如:
>>> [3*x for x in [1,2,3]]
[3, 6, 9]
將此應用到您的示例中將類似于:
for i in factors:
multiply = [i*x for x in values[i-1]]
您只保留最后一次計算 multiply
每次for回圈時,您都會為 分配一個新值multiply,覆寫之前存在的任何值。如果你想收集你所有的結果,那么你應該append到multiply串列中。
multiply.append([i*x for x in values[i-1]])
總之,您的示例固定為:
factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
multiply = []
for i in factors:
multiply.append([i*x for x in values[i-1]])
改進
但是,在簡潔性和可讀性方面仍有改進代碼的方法。
問題的根源是將串列的元素乘以一個數字。*不能這樣做,但您可以撰寫自己的函式,它可以:
def multiply_list(X, n):
return [n*x for x in X]
然后你可以使用這個函式和一個串列理解來洗掉for回圈:
multiply = [multiply_list(x, i) for (x, i) in zip(values, factors)]
或者,如果您認為它是可讀的,那么您可以使用嵌套串列推導式,它更簡潔:
multiply = [[factor * x for x in value] for (value, factor) in zip(values, factors)]
uj5u.com熱心網友回復:
您可以對單行使用串列理解。試試這個
multiply = [[x * y for y in list1] for x in list1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394065.html
上一篇:ESP32 micropython 應用填坑(一):藍牙
下一篇:筆記——流水線基礎概念
