我有這個代碼:
#!/usr/bin/python3
def contract(e, i, c, n):
l = len(e)
grid = [[0 for i in range(i 1)] for x in range(l)]
for num1, row1 in enumerate(grid):
row1[0] = e[num1] #add exponents
for num2, row2 in enumerate(grid):
if 0 <= num2 < n[0]:
grid[num2][1] = c[num2]
if n[0] <= num2 < n[0] n[1]:
grid[num2][2] = c[num2]
if n[0] n[1] <= num2 < n[0] n[1] n[2]:
grid[num2][3] = c[num2]
for g in grid:
print(g)
e = [0, 1, 2, 3]
i = 3
c = [4, 5, 6, 7]
n = [1, 2, 1]
contract(e, i, c, n)
這段代碼的想法是我有一個具有維度的二維網格len(e) x (i 1)。第一列包含指數 e。其余列應包含系數c,以n確定系數在網格中的位置。例如,由于n[0] = 1網格中的第 1 列第 0 行包含數字 4。其中的下一個元素n是 2,因此網格中的下一列(第 2 列)應該包含 2 個數字,這意味著在該行下方的行中的數字 5 和 6我以前使用過(意思是第 1 行和第 2 行,因為第 0 行已被使用)。n[2] = 1所以grid[3][3] = 7等
我用重復的 if 陳述句實作了這一點,代碼作業正常,輸出應該是這樣的:
[0, 4, 0, 0]
[1, 0, 5, 0]
[2, 0, 6, 0]
[3, 0, 0, 7]
但是,我想制作一個通用代碼,可以對任意數量的系數和指數執行此操作。如何將那些重復的 if 陳述句轉換為單個回圈?
uj5u.com熱心網友回復:
我會將其轉換為一個for回圈,以跟蹤到目前為止看到的元素的總和,如果不等式在該迭代中成立,則調整相應的元素:
for num2, row2 in enumerate(grid):
total = 0
for n_idx, n_elem in enumerate(n):
if total <= num2 < total n_elem:
grid[num2][n_idx 1] = c[num2]
total = n_elem
我建議不要sum()在這個回圈中使用,因為它會在每次迭代時從頭開始重新計算總和,這不是很有效。
uj5u.com熱心網友回復:
使用對n串列的連續切片求和的回圈。
for num2, row2 in enumerate(grid):
for idx in range(len(n)):
if sum(n[:idx]) <= num2 < sum(n[:idx 1]):
grid[num2][idx 1] = c[num2]
n這是您撰寫的代碼到回圈的直接映射,如果不會變得太大,也是合理的。BrokenBenchmark 的答案經過優化,以利用每個切片的總和是前一個切片加上當前元素的總和這一事實。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456160.html
上一篇:如何將顏色條添加到現有的軸手柄?
