我知道我可以使用字符串[3:4]之类的东西在Python中获取子字符串,但3在某些序列[::3]中是什么意思?


当前回答

记住基础就是[开始:结束:步骤]的意思。从这里你可以得到一个[1::2]得到每个奇数索引,一个[::2]得到每个偶数索引,一个[2::2]得到每个偶数索引,一个[2:4:2]得到每个偶数索引,从2开始,以4结束。灵感来自https://stackoverflow.com/a/3453102/1601580

其他回答

记住基础就是[开始:结束:步骤]的意思。从这里你可以得到一个[1::2]得到每个奇数索引,一个[::2]得到每个偶数索引,一个[2::2]得到每个偶数索引,一个[2:4:2]得到每个偶数索引,从2开始,以4结束。灵感来自https://stackoverflow.com/a/3453102/1601580

Seq [::n]是整个序列中第n个元素的序列。

例子:

>>> range(10)[::2]
[0, 2, 4, 6, 8]

语法为:

seq[start:end:step]

所以你可以这样做(在Python 2中):

>>> range(100)[5:18:2]
[5, 7, 9, 11, 13, 15, 17]

你也可以在你自己的自定义类中使用这个符号,让它做任何你想做的事情

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)

# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)

# Ellipsis class object.
assert C()[...] == Ellipsis

然后我们可以像这样打开切片对象:

s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3

在Numpy中,这主要用于对多维数组进行任意方向的切片。

当然,任何正常的API都应该使用::3和通常的“每3个”语义。

相关的省略符将在以下部分进一步介绍:省略符对象做什么?

它的意思是“第一个参数什么都没有,第二个参数什么都没有,然后跳转到3”。它对序列中的每三项进行切片。 加长的切片就是你想要的。Python 2.3新增功能

解释

S [i:j:k],根据文档,是“S从i到j,步长k的切片”。当i和j不存在时,假设整个序列,因此s[::k]表示“每第k项”。

例子

首先,让我们初始化一个列表:

>>> s = range(20)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

我们取s中的每3项:

>>> s[::3]
[0, 3, 6, 9, 12, 15, 18]

我们取s[2:]中的每3项:

>>> s[2:]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> s[2::3]
[2, 5, 8, 11, 14, 17]

让我们从s[5:12]中选取每3项:

>>> s[5:12]
[5, 6, 7, 8, 9, 10, 11]
>>> s[5:12:3]
[5, 8, 11]

我们取s[:10]中的每3项:

>>> s[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[:10:3]
[0, 3, 6, 9]