如何使用Python内置的切片对象?
我知道 Pythonic 切片:l1[start:stop:step]
。
内置函数slice
有什么用?
我该如何使用它?
I know Pythonic slicing : l1[start:stop:step]
.
What's the use of built-in function slice
?
How can I use it ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以通过使用与执行 [start:end:step] 表示法时使用的字段相同的字段来调用 slice 来创建切片:
要使用切片,只需将其传递为列表或字符串的索引即可:
假设您有一个固定长度文本字段的文件。您可以定义一个切片列表,以便轻松地从此文件中的每个“记录”中提取值。
印刷:
You create a slice by calling slice with the same fields you would use if doing [start:end:step] notation:
To use the slice, just pass it as if it were the index into a list or string:
Let's say you have a file of fixed-length text fields. You could define a list of slices to easily extract the values from each "record" in this file.
Prints:
序列后面的方括号表示索引或切片,具体取决于括号内的内容:
这两种情况都由序列的 __getitem__() 方法(或 __setitem__() 如果在等号左边。)索引或切片作为单个参数传递给方法,Python 执行此操作的方式是通过转换切片符号,(
1:10:2
,在本例中)转换为切片对象:slice(1,10,2)
。因此,如果您正在定义自己的类似序列的类或重写另一个类的 __getitem__ 或 __setitem__ 或 __delitem__ 方法,则需要测试index 参数来确定它是
int
还是slice
,并进行相应处理:slice
对象具有三个属性:start< /code>、
stop
和step
以及一种方法:indices
,它采用单个参数(对象的长度),并返回一个三元组:(开始、停止、步骤)
。Square brackets following a sequence denote either indexing or slicing depending on what's inside the brackets:
Both of these cases are handled by the
__getitem__()
method of the sequence (or__setitem__()
if on the left of an equals sign.) The index or slice is passed to the methods as a single argument, and the way Python does this is by converting the slice notation, (1:10:2
, in this case) to a slice object:slice(1,10,2)
.So if you are defining your own sequence-like class or overriding the
__getitem__
or__setitem__
or__delitem__
methods of another class, you need to test the index argument to determine if it is anint
or aslice
, and process accordingly:A
slice
object has three attributes:start
,stop
andstep
, and one method:indices
, which takes a single argument, the length of the object, and returns a 3-tuple:(start, stop, step)
.slice
函数返回 切片对象。 Slice 对象是 Python 的内部类型之一,它针对读取性能进行了优化 - 它们的所有属性都是只读的。如果希望更改默认行为,则更改
slice
可能会很有用。例如,lxml
使用切片表示法来访问 DOM 元素(但是,我没有我自己也证实了他们是如何做到的)。The
slice
function returns slice objects. Slice objects are one of Python's internal types, which are optimized for read performance - all of their attributes are read-only.Altering
slice
could be useful if wish to change the default behaviour. For example,lxml
uses slice notation to access DOM elements (however, I haven't confirmed how they did that myself).在尝试回答 根据变量对字符串进行子集 时,我记得 numpy 有定义切片对象的语法上很好的方法:
这里解决的问题是如何将切片存储在变量中以供以后使用,而
np.s_
允许这样做。是的,它不是内置的,但由于原始问题被重定向到这里,我觉得我的答案也属于这里。此外,numpy 也是 Python、IIRC 中添加如此高级切片功能的原因之一。更复杂的“切片”的示例:
其中 z 现在是切片元组。
While trying to answer Subset a string based on variable , I recalled that numpy has a syntactically nice way to define slice objects:
The problem solved here is how to store the slice in a variable for later use, and
np.s_
allows to do just that. Yes, it's not built-in, but as that original question was redirected here I feel like my answer belong here as well. Also, numpy was one of the reasons why so advanced slicing abilities were added to Python, IIRC.An example of a more complex "slicing":
where z is now a tuple of slices.
切片对象允许您以编程方式生成和操作切片。特别是对于多维 numpy 数组,尤其是如果您事先不知道维数,您可能需要即时构造切片来指定所需的轴或维度。
这里我们的数据最终是二维的(4×5),但并不能保证这一点。您将如何从
zz
请求切片?一个问题是我无法操作 Python 的切片表示法。它不是切片操作之外的有效语法。
如果我可以在循环中构建我想要的确切切片请求,就像构建字符串一样,会怎么样?那不是很好吗?我的意思是,当然您可以使用字符串来完成此操作,但它会很混乱并且需要
eval
。所以我们在这里:
slice
对象可以让你做到这一点。您可以即时组装列表和元组,将它们作为函数参数传递,对它们进行排序,对它们进行洗牌等等。Slice objects let you programmatically generate and manipulate slices. Especially for multidimensional numpy arrays, and especially if you don't know the dimensionality in advance, you might want to construct slices on-the-fly to specify the axes or dimensions that you want.
Here our data ended up being two dimensional (4-by-5), but there was no guarantee of that. How will you request slices from
zz
?One problem is that I can't manipulate Python's slice notation. It's not valid syntax outside of a slicing operation.
What if I could just build up the exact slice request I wanted in a loop, the way I can build up a string? Wouldn't that be great? I mean, sure you can use a string to do it, but it would be messy and requires
eval
.So here we are:
slice
objects let you do this. You can assemble lists and tuples of them on-the-fly, pass them as function parameters, sort them, shuffle them, and so on.