對于輸入值,即 x、y、z、n,我想將所有組合列印為串列理解,其中 0<=i<=x, 0<=j<=y, 0<=k<=z, 其中 i j k != n。
這個怎么做?我正在考慮使用 itertools.permutations() 但我不知道如何。如何以適當的格式輸入這些 x、y、z、n?
uj5u.com熱心網友回復:
用于itertools.product獲取所有范圍的笛卡爾積:
[triple for triple in itertools.product(range(x 1), range(y 1), range(z 1)) if sum(triple) != n]
uj5u.com熱心網友回復:
[(i,j,k) for i in range(x 1) for j in range(y 1) for k in range(z 1) if i j k!=n]
一些時間考慮。x=10, y=8, z=6, n=10
- 此方法(我們稱其為“方法三重法”):3.27(在我的機器上運行 50000 秒)
- Barmar 方法(“積/和法”):3.56
所以,我們都松了,因為最好的方法(到目前為止)是這兩種方法之間的折衷:
# Fastest so far
[(i,j,k) for i,j,k in itertools.product(range(x 1),range(y 1),range(z 1)) if i j k!=n]
因此,主要思想是 Barmar 的思想(使用 itertools.product)。我認為,使他們的解決方案變慢的原因只是對“求和”的呼叫。并不是說它很廣闊,而是與 i j k 相比...
所以這第三種解決方案避免了三元組(好吧,不是真的。在引擎蓋下“.product”也有這個三元組。但不同的是我的三元組是在解釋的python中,而 itertools.product 可能是在編譯的 C 代碼中),并且還避免了求和。以處理 3 個變數為代價,但顯然值得。時間:
- itertools/i j k 方法:2.94
一般來說,對于嚴格相同的任務,應該支持 itertools,因為它比真正的 python for 回圈更快(嗯,復合串列也不是真正的 for 回圈。但是,仍然)。在這種情況下,由于無論如何計算都非常快,通常可以忽略不計的差異(sum vs )就足以扭轉排名。但我們可以擺脫它
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518594.html
標籤:Python列表理解
上一篇:子查詢
