【问题标题】:Simple Python String (Backward) Slicing简单的 Python 字符串(向后)切片
【发布时间】:2023-03-27 22:10:02
【问题描述】:

是的,我知道上面有很多类似的问题。但我就是找不到我要找的东西。

我的困惑在于反向切片。

my_jumble = ['jumbly', 'wumbly', 'number', 5]
print(my_jumble[:1:-1])

现在我发现结果会是

[5, 'number']

所以我想也许我会通过改变字符串切片的末端来测试它。

print(my_jumble[:2:-1])

我真的很确定 Python 会给我类似的东西

[5, 'number', 'wumbly']

相反,它给了我这个让我完全迷失的东西......

[5]

有人可以解释这里发生了什么吗?我是 Python 新手,发现这很令人困惑。感谢您的帮助。

【问题讨论】:

    标签: python python-3.x slice


    【解决方案1】:

    @HarryLens 要做你真正想做的事,你必须这样做。

    print(my_jumble[-1:0:-1])
    

    即使这样也可以:

    print(my_jumble[:0:-1])
    

    我想你相信当你跨步 -1 时,列表会颠倒。您会看到第一个数字表示当前列表中的起始位置,第二个数字表示当前列表中的结束位置(您想要的切片),而不是反向列表。参考this.

    【讨论】:

    • 那么这里的逻辑是什么?我的意思是这个'print(my_jumble [:2:-1])'意味着从开始到第三个元素向后打印东西?我超级困惑...@Dhruv
    • @Alan, print(my_jumble[:2:-1]) 不是有效[0:2:-1] 试试看:[0: 2: -1] 只会打印出[]
    【解决方案2】:

    我认为了解代码中发生的事情的最简单方法之一是了解反向切片反转您索引列表的方式视觉上,它是喜欢反转您的列表)被切片之前列表中元素的索引本身不会改变。

    因此,当您有这样的列表时:

    ['jumbly', 'wumbly', 'number', 5]
        0        1         2       3   #<-- index
    

    通过使其向后读取(添加-1 作为第三个索引器),您使其看起来像这样(因为它现在从最后一个索引到第一个索引,而不是从第一个索引到最后):

    [5, 'number', 'wumbly', 'jumbly']
     3      2         1       0       #<-- index
    

    然后当你从“开始”切到一个(:1)时,你会从“开始”(现在“开始”是3)得到所有内容,并在看到1时停止:

    [5, 'number', 'wumbly', 'jumbly']
     3      2         1       0       #<-- index
     ^      ^         x
     grab! grab!      nope!
    

    这样你就得到了回报:

    [5, 'number']
    

    当您使用 [:2:-1] 进行反向切片时,同样的原则适用:

    [5, 'number', 'wumbly', 'jumbly']
     3      2         1       0       #<-- index
     ^      x
     grab!  nope!
    

    因此你得到了你的结果:

    [5]
    

    现在,使用这个原则,如果你想返回你想要的东西,你知道把什么作为第二个索引器:零! --> [:0:-1]:

    [5, 'number', 'wumbly', 'jumbly']
     3      2         1       0       #<-- index
     ^      ^         ^       x
     grab!  grab!     grab!   nope!
    

    然后,你会得到你想要的结果:

    [5, 'number', 'wumbly']
    

    【讨论】:

    • 惊人的解释。我现在明白了。非常感谢。
    • @HarryLens 欢迎您! ;) 当我们能够以图形方式看到它时,事情就会变得更容易理解...... :)
    • > 反向切片在切片之前先反转您的列表
    • @warvariuc 我说的是“内涵”,也许我应该为此写一个注释..
    • @warvariuc 好的,我更新了我的答案..我认为现在更清楚了......“反向”是“视觉上”而不是“实际上”,因为它实际上是正在反转的索引
    【解决方案3】:

    您使用的语法是list[start:stop:step]

    如果你没有为start 输入值,甚至不为零,那么 python 会决定一个合适的开始。 0 表示正步骤,最后一个元素表示负步骤。

    所以在第一个示例中,您实际上是在说选择从01 的所有项目,但顺序相反。所以它打印出[5,'number']

    在您的第二个示例中,您所说的是从第一个到第三个,以相反的顺序选择所有项目。所以反过来,你从5开始,你列表中的第三项是'number',但由于你只说到第三项,它就停在那里。

    由于您为 stop 提供了正值,因此它将是从左到右的方向,因此在您的情况下,第三个元素的顺序是正确的。

    还要注意,在python中list[start: stop]等价于[start: stop),考虑第一个元素,不包括右边界。

    【讨论】:

      【解决方案4】:

      array[start:end:step] 表示从索引start 开始,然后在每个循环循环中添加step,如果索引大于或等于end,则中断循环。如果省略start,则等于0。如果省略end,则设置为len(array)。如果startend 为负数,则设置为len(array) + startlen(array) + end。如果step 为负数,则在每个循环周期将其添加到当前索引中,但继续循环的条件是current_index &gt; end,而不是current_index &lt; endstep 为正数时。

      所以['jumbly', 'wumbly', 'number', 5][:1:-1] 的意思是开始从索引len(array) 获取元素到索引1(不包括)——所以我们得到了['number', 5] 的项目:

      >>> ['jumbly', 'wumbly', 'number', 5][:1:-1]
      >>> [5, 'number']
      

      ['jumbly', 'wumbly', 'number', 5][:2:-1] 表示开始将元素从索引len(array) 获取到索引2(值'number' 存储在索引2 的列表中)(不包括)——所以我们有[5]

      >>> ['jumbly', 'wumbly', 'number', 5][:2:-1]
      >>> [5]
      

      或者用一个以字符为索引的字符串更好地解释:

      >>> '0123'[:1:-1]
      >>> '32'
      
      >>> '0123'[:2:-1]
      >>> '3'
      

      【讨论】:

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