我以前見過這個問題,但它只處理本質上是線性的遞回。我正在尋找更通用的東西。
假設我有以下代碼
n = 10
num_bits = [0]
for i in range(n):
nums_bits.append(num_bits[i>>1] i%2)
此代碼將計算 num_bits,這是一個 11 元素陣列,其中 num_bits[i] 表示表示 i 所需的位數。
是否可以將其寫為串列理解?像這樣的東西不起作用
num_bits = [0]*11
num_bits = [num_bits[i>>1] i%2 for i in range(11)]
因為理解不會在評估程序中更新 num_bits 的值。除了 for 回圈之外,有沒有一種規范的方法來做這樣的事情?
PS 我知道還有其他方法可以解決這個問題:我只是將它用作更好地理解 Python 功能的工具。
編輯:總而言之,我想知道生成依賴于先前值的值串列的正確方法是什么。舉一個更簡單的例子,考慮斐波那契數
fibonacci = [0,1]
for i in range(10):
fibonacci.append(fibonacci[-1] fibonacci[-2])
有沒有辦法在理解中生成這些數字?如果沒有,除了 for 回圈(或者 for/while 回圈是我唯一的選擇)之外,還有什么工具可以解決這個問題?
uj5u.com熱心網友回復:
鑒于它不是我推薦的一段代碼,出于上面評論和另一個答案中討論的原因,這種理解應該比for回圈更快:
fibonacci = [0,1]
deque((fibonacci.append(fibonacci[-1] fibonacci[-2]) for _ in range(10)), maxlen=0)
因為它填充了使用生成器并丟棄結果的串列(一個空佇列,這是使用迭代器的最快推薦方式)
它產生:
>>> fibonacci
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
uj5u.com熱心網友回復:
不。
串列理解沒有很好的方法來做到這一點,這不是他們的目的。map串列推導的目的是為s 和s提供更易讀的替代方案filter,但事實并非如此,因此不可能以明智的方式做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/435095.html
標籤:Python python-3.x 递归 列表理解
