【问题标题】:Learn Python in One Day - list slice notation confusion specifically from the book [duplicate]Learn Python in One Day - 专门从书中列出切片符号混淆 [重复]
【发布时间】:2019-01-29 21:16:33
【问题描述】:

各位程序员好,

我是编程新手,想知道是否有人可以帮助我解决问题?我不确定这是因为它的写作方式,还是它只是一种真实但矛盾的做事方式。

我目前正在从“一日学习 Python”一书中学习 Python,他们对列表切片的解释让我感到困惑。一开始,他们声明各个索引总是从零开始,但在后面的示例中,他们似乎使用“1”作为起点(?)并以索引 5 - 1 结束?

他们在下面使用的例子是:userAge = [21, 22, 23, 24, 25]

在一开始,在下面的摘录中,他们解释了 21 = 0 的索引,22 = 1、23 = 2、24 = 3 和 25 = 4 的索引。

但是当他们到达提取的底部时,他们正在谈论第 5 个索引(尽管上面的示例中没有)...

这是本书的摘录。我强调了让我感到困惑的部分:

“列表中的各个值都可以通过它们的索引访问,并且索引总是从零开始,而不是从 1。这是几乎所有编程语言的常见做法,例如 C 和Java。因此第一个值的索引为 0,下一个值的索引为 1,依此类推。例如,userAge[0] = 21,userAge[1] = 22。

或者,您可以从后面访问列表的值。列表中最后一项的索引为 -1,倒数第二项的索引为 -2,依此类推。因此,userAge[-1] = 25,userAge[-2] = 24。

您可以将列表或其中的一部分分配给变量。如果写userAge2 = userAge,变量userAge2就变成[21,22,23,24,25]。

如果你写 userAge3 = userAge[2:4],你将把索引 2 到索引 4-1 的项从列表 userAge 分配给列表 userAge3。换句话说,userAge3 = [23, 24]。

符号 2:4 被称为切片。每当我们在 Python 中使用切片表示法时,总是包含起始索引处的项目,但始终排除末尾的项目。因此表示法 2:4 指的是从索引 2 到索引的项目4-1(即索引 3),这就是为什么 userAge3 = [23, 24] 而不是 [23, 24, 25]。

切片符号包括第三个数字,称为步进器。如果我们写 userAge4 = userAge[1:5:2],我们将得到一个子列表,其中包含从索引 1 到索引 5-1 的每一秒数,因为步进器是 2。因此,userAge4 = [22, 24]。

此外,切片符号有有用的默认值。第一个数字的默认值为零,第二个数字的默认值是被切片的列表的大小。例如, userAge[ :4] 为您提供从索引 0 到索引 4-1 的值,而 userAge[1: ] 为您提供 从索引 1 到索引 5-1 的值(因为 userAge 的大小为5,即 userAge 有 5 个项目)。”

如果原始示例只有索引 0 - 4,我不确定他们从哪里得到“5 - 1”(尽管这意味着列表中有五个项目)。这是“规则更改”还是他们将索引号从 0 更改为 4,从 1 更改为 5?我知道'5 - 1'意味着你会因为上面提到的“最终排他”而回到索引4,但你不需要那里的项目才能减去它吗?在原始示例中,没有第 5 个索引(尽管列表中有 5 个项目)...

不用说,我很困惑!哈哈。

提前感谢您的帮助!

简。 x

【问题讨论】:

  • userAge[1: ] 是一个从索引 1 开始(显式写入)并在此特定情况下以索引 4 结束的切片(长度为 5,未指定的结束索引的默认值为 length-1)。不清楚你为什么认为这里发生了任何不同的事情。
  • 不,索引方法没有变化,总是从0开始。可以认为:切片的第一部分是第一个要包含的索引,第二部分是第一个索引之后包含。您似乎将其视为指定要包含的第一个和最后一个索引,这导致了混乱。
  • 在对userAge[1:] 进行切片时,它会获取从 2nd 元素一直到最后一个元素的所有内容。
  • 我一直发现official Python tutorial 足以解释这些事情。 strings 部分包含对切片的讨论。
  • @VictorValente - 所以,他们的注释“最后的项目总是被排除在外”在这种情况下不适用?

标签: python list slice notation


【解决方案1】:

嗯,这段摘录中有很多误导性的解释。

关于切片的默认值——忘记索引,在“人类”解释中:

  • data[x:] – 从索引 x 开始一直到结束的切片
  • data[:x] – 从头开始​​切片,一直到 x-th 元素

他们讲述5 - 1 的原因是因为切片的第二个值是独占的,即显式切片直到长度为 N 的数组的末尾,您正在编写 [:N],但最后一个元素将具有索引 @ 987654327@ - 正是因为索引从 0 开始,但元素计数从 1 开始。

【讨论】:

    【解决方案2】:

    在对userAge[1:] 进行切片时,您会得到从 2nd 元素一直到最后一个元素的所有内容。

    userAge[1:] = [22, 23, 24, 25]

    【讨论】:

      【解决方案3】:

      切片可以这样解释。

      a[first:last]#items goes at first to last-1
      a[first:]#items goes from first to the rest of the array
      a[:last]#items from the beginning to the end-1
      a[:]#copy of the whole array.
      

      步骤

      a[first:last:step]#starts from first, not past last,by step.
      

      我再举一个例子,如果你要求 a[:-2] 并且 an 只包含一个元素,你会得到一个空列表而不是错误。

      所以,当我们使用 `userage[1:] 时,一切都从第二个元素开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        相关资源
        最近更新 更多