我的意圖是生成一個通用的空串列,然后將其附加一個數字序列,使其給出零,但在第三位它給出 3,然后是它的倍數,即 a[(0,0,3,0,0 ,6,0,0,9)] 并且它需要有 100 個值。我首先設定串列,然后在范圍(0,100)中使用“for”回圈,我確信我需要以這樣的方式使用 %,以便每當我的序列從 1 到 100 完全可被 3 整除時,它會回傳 3(而不是 0) 但它在 6、9、12 中不斷發展。我該怎么辦?
for i in range(0,100):
if i%3==0:
return 0
else
return 3
當然,這是完全錯誤的,但我一般是編程新手。提前致謝。
uj5u.com熱心網友回復:
你可以試試這個:
for i in range(0, 100, 3):
list[i]=i
您只需更改范圍函式的“步驟”,因此索引i也將代表串列中傳遞的值,它應該可以正常作業。
uj5u.com熱心網友回復:
@Mark的評論非常相關,并以非常簡單的方式很好地利用了模數和串列理解屬性。此外,它的代碼很容易適應任何值。
然而,模運算子非常慢,所以這里有其他方法可以達到相同的結果。
方法一
我們可以以 3 為步長創建一個從 3 到 101 的范圍,并添加[0, 0, i]到每個步長。由于串列末尾會缺少零,因此我們必須添加與 100 除以 3 的其余部分一樣多的數字。
data = [num for i in range(3, 101, 3) for num in [0, 0, i]] [0] * 1
方法二
同樣的想法,我們可以使用.extend()在每個術語之前添加兩個 0。
data = []
for i in range(3, 101, 3):
data.extend([0, 0, i])
data.append(0)
方法三
最簡單的想法是,我們創建一個包含 100 個零的串列,然后每 3 個術語修改一次值。
data = [0] * 100
for i in range(2, 101, 3):
data[i] = i 1
比較
使用timeit,這里是每個演算法的速度比較,比較是基于 10000 次重復。
import timeit
print(timeit.timeit("data = [0 if n % 3 else n for n in range(1, 101)]"))
print(timeit.timeit("data = [num for i in range(3, 101, 3) for num in [0, 0, i]] [0] * 1"))
print(timeit.timeit("""
data = []
for i in range(3, 101, 3):
data.extend([0, 0, i])
data.append(0)
"""))
print(timeit.timeit("""
data = [0] * 100
for i in range(2, 101, 3):
data[i] = i 1
"""))
輸出:
4.137781305000317
3.8176420609997876
2.4403464719998738
1.4861199529996156
因此,最后一種演算法是最快的,幾乎比使用模數快 3 倍。
uj5u.com熱心網友回復:
一個函式在遇到return. 因此,在您的代碼中,您只能執行一次回圈。
但是,如果我們可以改變它呢?你知道發電機是什么嗎?看看這個:
def multiples_of_three_or_zero():
for i in range(0,100):
if i%3==0:
yield 0
else
yield 3
那是一個發電機。yield不會結束執行,而是暫停它。你像這樣使用它:
for i in multiples_of_three_or_zero():
print(i)
或者,如果您真的想要串列中的所有元素,只需從中創建一個串列:
list(multiples_of_three_or_zero())
uj5u.com熱心網友回復:
好的,我練習了一點,我發現這個解決方案最適合我的需要(這是一個帶回家的練習)
A=[]
for a in range (1,101):
if a%3==0:
A.append(a)
else:
A.append(0)
print(A)
謝謝大家!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/452116.html
下一篇:LINQvar型別轉換為List
