python: 切片符号(slice notation)

来源:互联网 发布:温州淘宝运营培训班 编辑:程序博客网 时间:2024/06/07 05:32

起因

在阅读大神的代码时看到这么一段:

nums[k + 1:] = nums[:k:-1]

Python语言的正序切片符号我懂,逆序切片符号我就不是很懂了。上StackoverFlow搜了一下,总结如下。

总结

正序

Grammar Annotation L[:] [seq[0], seq[1], …, seq[-1] ] L[low:] [seq[low], seq[low+1], …, seq[-1] ] L[:high] [seq[0], seq[1], …, seq[high-1]] L[low:high] [seq[low], seq[low+1], …, seq[high-1]] L[::stride] [seq[0], seq[stride], …, seq[-1] ] L[low::stride] [seq[low], seq[low+stride], …, seq[-1] ] L[:high:stride] [seq[0], seq[stride], …, seq[high-1]] L[low:high:stride] [seq[low], seq[low+stride], …, seq[high-1]]

逆序

Grammar Annotation L[::-stride] [seq[-1], seq[-1-stride], …, seq[0] ] L[high::-stride] [seq[high], seq[high-stride], …, seq[0] ] L[:low:-stride] [seq[-1], seq[-1-stride], …, seq[low+1]] L[high:low:-stride] [seq[high], seq[high-stride], …, seq[low+1]]

实验代码

# coding=utf-8L = [0, 10, 20, 30, 40, 50]low, high, stride = 1, 4, 2# 正序assert L[:] == [0, 10, 20, 30, 40, 50] # [seq[0],   seq[1],          ..., seq[-1]    ]assert L[low:] == [10, 20, 30, 40, 50] # [seq[low], seq[low+1],      ..., seq[-1]    ]assert L[:high] == [0, 10, 20, 30]     # [seq[0],   seq[1],          ..., seq[high-1]]assert L[low:high] == [10, 20, 30]     # [seq[low], seq[low+1],      ..., seq[high-1]]assert L[::stride] == [0, 20, 40]      # [seq[0],   seq[stride],     ..., seq[-1]    ]assert L[low::stride] == [10, 30, 50]  # [seq[low], seq[low+stride], ..., seq[-1]    ]assert L[:high:stride] == [0, 20]      # [seq[0],   seq[stride],     ..., seq[high-1]]assert L[low:high:stride] == [10, 30]  # [seq[low], seq[low+stride], ..., seq[high-1]]# 逆序assert L[::-stride] == [50, 30, 10]    # [seq[-1],   seq[-1-stride],   ..., seq[0]    ]assert L[high::-stride] == [40, 20, 0] # [seq[high], seq[high-stride], ..., seq[0]    ]assert L[:low:-stride] == [50, 30]     # [seq[-1],   seq[-1-stride],   ..., seq[low+1]]assert L[high:low:-stride] == [40, 20] # [seq[high], seq[high-stride], ..., seq[low+1]]