当我发现以下内容时,我试图从Wikipedia理解Kadane的算法:
def max_subarray(A):
max_ending_here = max_so_far = A[0]
for x in A[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
我对Python不熟悉。我试图用谷歌搜索该语法的作用,但是我不知道正确的答案,因为我不知道它叫什么。但是,我认为A[1:]
这等同于省略A[0]
,所以我认为for x in A[1:]:
等同for(int i = 1; i < A.length; i++)
于Java
但是,更改for x in A[1:]:
为后for x in range(1,len(A))
,我得到了错误的结果
抱歉,这是一个愚蠢的问题,但我不知道在哪里可以找到答案。有人可以告诉我这种语法的含义是什么吗?另外,您能给我相当于for x in A[1:]:
Java的东西吗?
这是数组切片语法。看到这样的问题:解释Python的切片符号。
对于my_list
对象列表,例如[1, 2, "foo", "bar"]
,my_list[1:]
等于从0索引开始的所有元素的浅表复制列表1
:[2, "foo", "bar"]
。因此,您的for
语句将遍历以下对象:
for-iteration 0: x == 2
for-iteration 1: x == "foo"
for-iteration 2: x == "bar"
range(..)
返回索引(整数)的列表/生成器,因此您的for语句将遍历整数 [1, 2, ..., len(my_list)]
for-iteration 0: x == 1
for-iteration 1: x == 2
for-iteration 2: x == 3
因此,在后一个版本中,您可以x
用作列表的索引:iter_obj = my_list[x]
。
另外,如果您仍然需要迭代索引(例如,用于当前对象的“计数”),则可以使用稍微更pythonic的版本,可以使用enumerate
:
for (i, x) in enumerate(my_list[1:]):
# i is the 0-based index into the truncated list [0, 1, 2]
# x is the current object from the truncated list [2, "foo", "bar"]
如果您决定将其类型更改为其他类型,则此版本将为将来提供更多证明my_list
,因为它不依赖于基于0的索引的实现细节,因此更可能与支持切片语法的其他可迭代类型一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句