Python:A[1:]中的x是什么意思?

2024-06-02 05:35:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从维基百科上了解卡丹的算法,这时我发现:

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:]:等同于Java中的for(int i = 1; i < A.length; i++)

但是,在将for x in A[1:]:更改为for x in range(1,len(A))之后,我得到了错误的结果

如果这是个愚蠢的问题,我很抱歉,但我不知道还能在哪里找到答案。有人能告诉我这个语法是什么,叫什么吗?另外,你能给我Java中for x in A[1:]:的等价物吗?


Tags: 答案in算法forreturnsoheredef
3条回答

这是array slice语法。请看这个问题: Explain Python's slice notation

对于对象的列表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]

或者,如果您仍然需要迭代索引(例如,对于当前对象的“count”),则可以使用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的索引的实现细节,因此更可能使用支持切片语法的其他可iterable类型。

与其他语言不同,在Python中遍历序列会生成序列本身中的元素。这意味着迭代[1, 2, 4]依次产生124,而不是012

下面是一些我试过的例子

>>> a=[1,5,9,11,2,66]

>>> a[1:]
[5, 9, 11, 2, 66]

>>> a[:1]
[1]

>>> a[-1:]
[66]

>>> a[:-1]
[1, 5, 9, 11, 2]

>>> a[3]
11

>>> a[3:]
[11, 2, 66]

>>> a[:3]
[1, 5, 9]

>>> a[-3:]
[11, 2, 66]

>>> a[:-3]
[1, 5, 9]

>>> a[::1]
[1, 5, 9, 11, 2, 66]

>>> a[::-1]
[66, 2, 11, 9, 5, 1]

>>> a[1::]
[5, 9, 11, 2, 66]

>>> a[::-1]
[66, 2, 11, 9, 5, 1]

>>> a[::-2]
[66, 11, 5]

>>> a[2::]
[9, 11, 2, 66]

我想你可以通过这些例子了解更多。

相关问题 更多 >