能取值亦能赋值的Python切片

dongfanger 2021-02-23 08:57:13
Python 赋值 切片 取值 能取


切片,就像面包,给几刀,切成一片一片,可以做成吐司,也可以做成三明治,口味更佳:

列表(list)、元组(tuple)、字符串(str)都能进行切片,得到子片段,实际上切片操作比想象的要强大很多,能取值,亦能赋值。

忽略最后一个元素

切片是用下标和冒号来描述的,比如s[2:13]。对于2, 3, ..., 12这个序列,表达为[2, 13),左闭右开,比[2, 12](1, 13)都更合理,理由如下:

  1. 上限减去下限等于元素个数,比如13 - 2 = 11,刚好就有11个元素。
  2. 连续的范围没有重叠,比如[2, 13)[13, 25) 是两个连续的范围,13只会包含在后一个里。

下标从0开始

对于10个元素,写成[0, 10)[1, 11)更合理,理由如下:

  1. N个元素,[0, N)[1, N+1)写法更简洁,不需要+1

  2. 某个元素的下标等于排在它前面元素的个数,方便使用,比如:

    0 1 2 3 4 5 6 7 8 9
    ^
    前面有4个元素
    

好用的切片

以上两个数学理论给切片使用带来了很多好处:

  • 当只有最后一个位置信息时,可以快速看出有几个元素,比如my_list[:3]返回3个元素。

  • 当起止位置信息都可见时,可以快速计算出长度,用stop - start就可以了,比如my_list[1:3]长度为2。

  • 利用任意一个下标把序列切割成不重叠的两部分,只要写成my_list[:x]my_list[x:]就可以了,比如

    >>> my_list = [10, 20, 30, 40, 50, 60]
    >>> my_list[:3]
    [10, 20, 30]
    >>> my_list[3:]
    [40, 50, 60]
    

Python里的范围(range)也是忽略最后一个元素,下标从0开始的。

切片间隔

切片除了s[a:b],还有第三个下标s[a:b:c],意思是对s在a和b之间以c为间隔取值,c还可以为负,负值意味着反向取值。比如:

>>> s = "bicycle"
>>> s[::3]
"bye"
>>> s[::-1]
"elcycib"
>>> s[::-2]
"eccb"

a:b:c更严谨的描述是start:stop:step

语法如此简洁,用脚想也知道是Python魔法方法干的好事!在对s[a:b:c]进行求值的时候,Python实际上会调用s.__getitem__(slice(a, b, c)),熟悉的配方,熟悉的味道。slice(a, b, c)a:b:c用在[]中返回的切片对象,slice()是Python内置函数,示例:

invoice = "Mini Kit $34.95 1 $ 34.95"
SKU = slice(0, 8)
print(invoice[SKU])

切片赋值

切片有一个强大功能是给切片赋值,如果把切片放在赋值语句的左边,或把它作为del操作的对象,我们就可以对序列进行嫁接、切除或就地修改操作。示例:

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 2, 3, 4, 7, 8, 9]
>>> l[3:2] = [11, 22]
>>> l
[0, 1, 2, 11, 22, 3, 4, 7, 8, 9]
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 3, 4, 7, 8, 9]

注意,如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象,即使只有单独一个值,否则会报错:

>>> l[2:5] = 100
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: can only assign an iterable

多维切片

除了一维切片,Python还支持多维切片,这在多维数组中能体现出来。NumPy是Python第三方库,提供了高阶数组,使得Python成为科学计算应用的主流语言。示例:

>>> import numpy
>>> a = numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> a.shape
(12,)
>>> a.shape = 3, 4
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[:, 1]
array([1, 5, 9])
>>> a[1:2, 2:3]
array([[6]])
>>> a[1:3, 2:4]
array([[ 6, 7],
[10, 11]])

在NumPy中,省略号...用作多维数组切片的快捷方式,如果x是四维数组,那么x[i, ...]就是x[i, :, :, :]的缩写,比如:

>>> a.shape = 2, 2, 3
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
>>> a[:, :, 1]
array([[ 1, 4],
[ 7, 10]])
>>> a[..., 1]
array([[ 1, 4],
[ 7, 10]])

小结

本文介绍了Python强大的切片操作,因为忽略最后一个元素和下标从0开始,所以切片用起来特别顺手,除了开始和结尾,还能设置切片间隔,间隔为负可以反向取值。切片赋值是切片另一个强大功能,需要注意的是赋值语句的右侧必须是个可迭代对象。

参考资料:

《流畅的Python》

https://blog.wz52.cn/archives/174.html

版权声明
本文为[dongfanger]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/df888/p/14432099.html

  1. Python 学习笔记: List
  2. 翻译:《实用的Python编程》02_03_Formatting
  3. Is there any age requirement for learning Python? Is 30 OK?
  4. Professor Tsinghua! The most complete Python tutorial in 12 hours (free sharing at the end of the article)
  5. Using Python to develop defi project
  6. Detailed explanation of Python function
  7. Python 可变类型作为函数默认参数时的副作用
  8. What do Python engineers do? What's their future?
  9. 这是我见过最好的Python教程:十分钟带你认识Python
  10. Python欢喜冤家:爬虫与反爬虫带着处理方案来给大家拜年了
  11. Python - zip() function
  12. 写Python会遇到如下的错误:ModuleNotFoundError: No module named 'email.mime'; 'email' is not a package
  13. Python类的调用以及私有和公有属性方法的调用
  14. Python类的专有方法
  15. Python基础之:数字字符串和列表
  16. How did Python pioneers evaluate this language on their 30th birthday?
  17. Python基础之:数字字符串和列表
  18. Python基础之:数字字符串和列表
  19. 窥探未来不是梦,python数据分析轻松实现
  20. This article will familiarize you with the transformation process of Python - & gt; cafe - & gt; om model
  21. 阿里、华为Python工程师总结的实用技巧,只有你还没看?
  22. 酸了!看到抖音上Python程序员晒得工资条......
  23. Python基础之:数字字符串和列表
  24. Importing excel into database adaptively by Python
  25. Python安装教程
  26. Python安装教程
  27. From Xiaobai to master, here is a guide to pandas
  28. [Python] drawing method of stem leaf diagram and compound pie diagram
  29. Drawing of Python geoplot spatial kernel density estimation map
  30. Python Seaborn economist's classic chart imitation
  31. Python space drawing - regionmask mask operation example
  32. Python space drawing - cartopy longitude and latitude add
  33. Python pykrige package Kriging interpolation calculation and visual rendering
  34. Python batch resampling, mask, slope extraction
  35. Python - Analysis of reachable circle of multiple traffic modes
  36. Python space drawing bubble drawing
  37. Python 3 multithreading and Mongo 100 million consumption log data fresh demo
  38. ARIMA model for predicting time series of CO2 concentration
  39. python isinstance()
  40. How to modify tens of thousands of file names with one key in Python
  41. Python notes: List
  42. Translation: practical Python Programming 02_ 03_ Formatting
  43. Python中的四种队列(queue)、堆(heap)
  44. Side effects of Python mutable types as default parameters of functions
  45. This is the best Python tutorial I've ever seen: ten minutes to get to know python
  46. 使用python编写量子线路打印的简单项目,并使用Sphinx自动化生成API文档
  47. Python happy enemy: crawler and anti crawler with a solution to give you New Year
  48. 使用python编写量子线路打印的简单项目,并使用Sphinx自动化生成API文档
  49. When writing python, you will encounter the following error: modulenotfounderror: no module named ' email.mime '; 'email' is not a package
  50. Python class call and private and public property method call
  51. Proprietary methods for Python classes
  52. Foundation of Python: number string and list
  53. Foundation of Python: number string and list
  54. Foundation of Python: number string and list
  55. 华为 Python网络自动化
  56. Python Cannot open E:\Python36\Scripts\pip-script.py
  57. Peeping into the future is not a dream, python data analysis is easy to achieve
  58. The practical skills summed up by Alibaba and Huawei Python engineers, only you haven't seen them yet?
  59. Sour! See the Python programmers on the tiktok get the pay slip...
  60. Foundation of Python: number string and list