以x [0:4:-1]的形式将元组切除索引

时间:2013-10-23 22:15:10

标签: python tuples

x = (1, 2, 3, 4)

此处,x[0:4:-1]提供空tuple ()。为什么会这样? 我认为它只会给出一个反转的元组(4,3,2,1) ......

2 个答案:

答案 0 :(得分:3)

您要求所有值从0开始,在4之前结束,一次计数-1。那没什么价值。

你想要做的是从3开始,在-1之前结束,一次计数-1。除了......你不能把-1放在那里,因为那意味着“从头到尾”。所以,你必须写“从3开始,当你用完整个序列时结束,一次计数-1”,如下所示:

x[3::-1]

或者更简单:

x[::-1]

将切片转换为显式循环可能有助于您的理解。它看起来像这样:

def slicify(sequence, start, end, step):
    if start < 0: start += len(sequence)
    if end < 0: end += len(sequence)
    result = []
    while (start < end if step > 0 else start > end):
        result.append(sequence[start])
        start += step
    return result

但这只是大致正确的。确切的定义在Sequence Types下的文件中,注释5:

  

sij的切片k被定义为索引为x = i + n*k的项目序列,0 <= n < (j-i)/k }。换句话说,索引是ii+ki+2*ki+3*k等等,在达到j时停止(但从不包括{{1} }})。如果ji大于j,请使用len(s)。如果省略len(s)ij,则它们会变为“结束”值(结束取决于None的符号)。请注意,k不能为零。如果kk,则会将其视为None

答案 1 :(得分:3)

您需要省略开始和结束,或反转开头和结尾:

x[::-1]    # (4, 3, 2, 1)
x[3:0:-1]  # (4, 3, 2)
x[3::-1]   # (4, 3, 2, 1)
x[3:-5:-1] # (4, 3, 2, 1)

不包括结束点,因此使用[3:0:-1]进行切片仅返回三个元素。最后一个示例使用负值从元组的长度中减去,最后得到端点-1

使用负步幅意味着Python想要向后计数,从0开始你永远不会达到4。

请注意,Python切片语法不仅适用于元组;字符串和列表支持完全相同的语法。