【问题标题】:Python String Slicing Stride ClarificationPython 字符串切片步幅说明
【发布时间】:2011-10-14 16:30:53
【问题描述】:

所以我并没有真正理解切片中的步幅参数。
比如"123456"[::-2]产生"642",但为什么"123456"[1::-2]产生"2""123456"[2::-2]产生"31"

【问题讨论】:

    标签: python stride


    【解决方案1】:

    最简单的解释方法可能是解决您的示例:

    "123456"[::-2]
    # This takes the whole string ([::])
    # Then it works backward (-)
    # and it does every other character (2)
    
    "123456"[1::-2]
    # This is also working backward (-)
    # every other character (2)
    # but starting at position 1, which is the number 2.
    
    "123456"[2::-2]
    # Again, working backward (-)
    # Every other character (2)
    # begin at position 2, so you end up with positions 2, and 0, or '31'
    

    切片语法为[<start>:<end>:step]。如果<start> 被省略且步长为负,则从字符串末尾开始。

    【讨论】:

    • 这是一个非常好的答案,对 OP 的澄清。 [::-2] 需要整个字符串,因为您没有分配 start,所以它会假设它是 0,很像 range(number)。此外,尝试使用索引来掌握它的窍门,一旦你这样做了,这是一个非常强大的功能。例如,这是一个很酷的单行回文检查器:string == string[::-1]。祝你好运!
    • 对于 "123456"[::-2] 为什么它以 6 开头而不是 1?我认为默认情况下省略 [::] 中的变量它从一开始(即 1)到结束,所以它肯定应该是 153...?
    • @DanielMak - 嗯?它不是从索引 0 开始然后回绕。你不可能得到 153。
    • 是的,这就是我不明白的...我的意思是在正常情况下(例如,不倒退),通过省略开始和结束,我们从零字符开始。现在我们唯一改变的是指定它倒退:我们仍然没有改变 stsrt 和 finish 参数,那么为什么它现在从 6 而不是 1 开始呢?抱歉,我才刚接触编程世界一周,但我非常感谢您的帮助!
    • @DanielMak - 这就是指定语言的方式。如果省略 start 并且 step 为负数,则输入列表(和结果)将反转。这里还有更多阅读资料:pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python。没什么好说的 - 它只是它是如何工作的
    【解决方案2】:

    那是因为语法是string[start:end:step]

    "123456"[::-2]
    

    产生“642”,因为它将从最后一个字符开始。这是因为您没有提供切片将从哪个位置执行。所以它会从最后一个返回 2 个字符,直到到达第一个。

    "123456"[1::-2]
    

    产生“2”,因为您告诉 Python 从第 2 个字符(字符串中的索引 1)开始,并且您告诉 Python 从该位置后退 2 步。在这种情况下,Python 显然只会返回“2”。这是因为当 Python 尝试返回 2 步时,它已经只用了一步就命中了字符串中的第一个字符。

    "123456"[2::-2]
    

    你现在应该可以弄清楚这一点了。但无论如何我都会解释一下。因此,您告诉 Python 从第三个字符(或索引 2)开始,然后从那里返回 2 步,直到它到达第一个字符。所以它会从“3”开始,然后后退两步,意外地到达了第一个字符——恰好是“1”。所以Python会给你“31”

    【讨论】:

      【解决方案3】:

      请记住,索引从零开始。考虑到这一点,如果将字符串更改为'012345' 可能会更清楚:

      In [1]: '012345'[1::-2]
      Out[1]: '1'
      
      In [2]: '012345'[2::-2]
      Out[2]: '20'
      
      In [3]: '012345'[5::-2]
      Out[3]: '531'
      

      如您所见,切片确实从正确的索引开始,并且在每一步都采用正确的(负)步幅,直到 in 到达字符串的开头。

      【讨论】:

        【解决方案4】:

        当您使用 stride 时,它​​基本上有两个参数。 (开始步幅的索引,步幅间隔)

        "1234"[index::interval]
        

        请记住,stings 的索引是从零开始的,所以

        "123456"[2::-2]
        

        是说从索引 2 或“3”开始并在间隔内抓取每个。

        "31"
        

        【讨论】:

          【解决方案5】:

          让我们了解一下python语法中的切片:

          string[starting index : ending index : step]
          

          还有你的第一个例子:

          "123456"[::-2]
          

          [::],不指定任何起始索引,它将取整个字符串,123456

          [::-2],值-2表示从字符串末尾开始每2步开始计数。

          所以,你会得到 642。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-30
            • 1970-01-01
            • 2014-07-21
            • 2012-02-15
            • 1970-01-01
            • 2014-01-30
            • 2013-10-29
            相关资源
            最近更新 更多