84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
如题.想用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循环。