b = a [:: - 1]是什么意思,如果给定a = range(0,5)?

时间:2017-05-23 11:24:52

标签: python

我得到的答案' b'是范围(4,-1,-1)。 所以我没有得到,如果[:-1]意味着"除了最后一个元素"或排除最后一个元素,但范围怎么样?' b'是逆转? 请解释一下。

3 个答案:

答案 0 :(得分:2)

<强>切片

  1. startstop的负数表示“从结尾”。它与len-value完全相同。
  2. step的负数表示“按相反顺序”。
  3. 空启动表示0,即第一个元素。
  4. 空停止意味着len。停止参数是独占的!
  5. 所以[::-1]表示从第1个元素到最后一个元素,步长为1,顺序相反。

    1. 如果您有[start:stop],则与step=1相同。所以[:-1]它意味着最后的一切。再次,这是独家的最后一个元素。它与[:-1:][0:-1:1]相同。
    2. 如果您只有start,则返回索引start给出的一个元素。因此[-1]表示最后一个元素。与[len-1]相同。

      <强>范围

      范围也有语法start,stop,step,但该步骤具有不同的含义。从start开始重复添加步骤。因此,您从4开始,然后添加-1,直到您点击stop,同时也是。因此range(5,0)[::-1]相当于range(4,-1,-1)。你可以计算它。

      为什么口译员会说range(0,5)[::-1] => range(4, -1, -1)

      Python解释器非常智能,可以将range切片转换为另一个range。这是一个优化,范围是生成器。它们是动态的,即它们不会立即将所有元素保存在存储器中。你正在使用的解释器一步一步地工作,它必须生成整个列表,只是为了能够以相反的顺序迭代。计算新发电机更聪明。

      如何完成,详细解释Łukasz的回答。

      顺便说一下。您可以强制它生成list,并阻止优化:

         range(0,5)[::-1]
      => range(4, -1, -1)
         list(range(0,5))[::-1]
      => [4, 3, 2, 1, 0]
      

答案 1 :(得分:1)

compute_slice函数用于在现有range对象(rangeobject *r)及其新值之间进行转换。如您所见,它基于rangeslice的开始/停止/步骤值作为O(1)操作完成。

static PyObject *
compute_slice(rangeobject *r, PyObject *_slice)
{
    PySliceObject *slice = (PySliceObject *) _slice;
    rangeobject *result;
    PyObject *start = NULL, *stop = NULL, *step = NULL;
    PyObject *substart = NULL, *substop = NULL, *substep = NULL;
    int error;

    error = _PySlice_GetLongIndices(slice, r->length, &start, &stop, &step);
    if (error == -1)
        return NULL;

    substep = PyNumber_Multiply(r->step, step);
    if (substep == NULL) goto fail;
    Py_CLEAR(step);

    substart = compute_item(r, start);
    if (substart == NULL) goto fail;
    Py_CLEAR(start);

    substop = compute_item(r, stop);
    if (substop == NULL) goto fail;
    Py_CLEAR(stop);

    result = make_range_object(Py_TYPE(r), substart, substop, substep);
    if (result != NULL) {
        return (PyObject *) result;
    }
fail:
    Py_XDECREF(start);
    Py_XDECREF(stop);
    Py_XDECREF(step);
    Py_XDECREF(substart);
    Py_XDECREF(substop);
    Py_XDECREF(substep);
    return NULL;
}

答案 2 :(得分:0)

您使用的方法在Python中称为Slicing

在python中

切片语法如下,

[ <first element to include> : <first element to exclude> : <step> ]

添加step部分是可选的。

以下是python列表如何考虑正负索引的表示。

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

使用时,

a = range(10)
# a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

a[10:0:-1] #or
a[-1:-10:-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1]

为什么因为当我们将0 / -10作为第二个参数时,它会排除0 / -10位置中的元素。

如此简单的方法是省略切片中的第二个参数。也就是说,

a[10::-1] #or
a[-1::-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# Which is what we want.

为了进一步简化,如果省略开始值和结束值并将步骤设为-1,则会再次产生相同的结果。

a[::-1]
# Output = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# The -1 at step position traverse the element from the last to the beginning

这是一个简单的备忘单,用于理解切片,

a[start:end] # items start through end-1
a[start:]    # items start through the rest of the array
a[:end]      # items from the beginning through end-1
a[:]         # a copy of the whole array

a[start:end:step] # start through not past end, by step

a[-1]    # last item in the array
a[-2:]   # last two items in the array
a[:-2]   # everything except the last two items

要了解有关切片的更多信息,请see this

希望这有帮助! :)