如题.想用python来做个最长连续递增子序列的函数,但发现在用for i in range(0,len(seq))的时候,在循环体不能修改i的值,请问有什么方法可以修改?
认证高级PHP讲师
修改for語句,改成用循環語句。
i = 0 length = len(seq) while i < length: #just do it i += 1
最長連續遞增子序列為嘛要修改i呢
for i in range(len(s1)): for j in range(len(s2)): if s1[i] == s2[j]: f[i][j] = f[i-1][j-1] + 1 else: f[i][j] = max(f[i-1][j],f[i][j-1]);
代碼隨手寫的,應該沒錯
python for 循環不能修改循環變量的原因是,range()象是一個迭代器,它隻會輸出信息,而不能修改迭代器的內容。python iterator的C結構是一個指針和一個對象列表。修改循環對象的值是C的思維方式,最好不要用在寫python代碼上。
嚴重不建議修改迭代變量,很多時候用它來做隨機訪問是不可能的。有很多其他方法可以做這個事情,用python的for-comprehension和一些reduce方法可以高效、穩定的解決。
你應該用列表解析等方法提前做好需要的修改,列表解析性能非常好,而for隻用來做別的操作。
你可以修改i的值,但每次循環之後for語句又會重新對i賦值,所以你問的問題不在於能否修改i,而是修改迭代器的行為,答案是不能。 你可以用while,或者,用個生成器:
def incSeq(seq): start = 0 for i in xrange(1, len(seq)): if seq[i] < seq[i-1]: yield start, i - start start = i maxIncSeq = reduce(lambda x,y: x if x[1]>y[1] else y, incSeq(seq))
得到最長遞增子串長度及起始位置,時間複雜度O(n).
為什麼要修改循環變量的取值,這樣做很可能會導致問題。建議用其他方法來實現,比如樓上幾位提到的while循環。
修改for語句,改成用循環語句。
最長連續遞增子序列為嘛要修改i呢
代碼隨手寫的,應該沒錯
python for 循環不能修改循環變量的原因是,range()象是一個迭代器,它隻會輸出信息,而不能修改迭代器的內容。python iterator的C結構是一個指針和一個對象列表。修改循環對象的值是C的思維方式,最好不要用在寫python代碼上。
嚴重不建議修改迭代變量,很多時候用它來做隨機訪問是不可能的。有很多其他方法可以做這個事情,用python的for-comprehension和一些reduce方法可以高效、穩定的解決。
你應該用列表解析等方法提前做好需要的修改,列表解析性能非常好,而for隻用來做別的操作。
你可以修改i的值,但每次循環之後for語句又會重新對i賦值,所以你問的問題不在於能否修改i,而是修改迭代器的行為,答案是不能。
你可以用while,或者,用個生成器:
得到最長遞增子串長度及起始位置,時間複雜度O(n).
為什麼要修改循環變量的取值,這樣做很可能會導致問題。建議用其他方法來實現,比如樓上幾位提到的while循環。