这几种数据结构的共性:

  1. 都是顺序存储
  2. 顺序访问
  3. 可迭代对象(可迭代对象可以用len方法获取其长度)
  4. 通过索引进行元素的访问
  5. 可以进行切片操作

切片

切片不会对原有的序列做任何修改,切片的语法为:

seq[start:stop]

从索引start开始,到索引stop结束,不包含stop,返回新的序列,不会对原有的对象做任何修改。

几个特性:

  • start超出索引范围:start = 0
  • stop超出索引范围:stop = -1
  • 负数索引:实际上可转化为:len(seq) + index
  • start >= stop时,返回空列表

slice的实现:

lst = list(range(0, 10))def slice(lst, start=0, stop=0):if start < 0:start = len(lst) + startif stop <= 0:stop = len(lst) + stopif stop <= start:return []if stop > len(lst):stop = len(lst)if start < 0:start = 0ret = []for i, v in enumerate(lst):if i >= start and i < stop:ret.append(v)return retprint(slice(lst, 3, 2))
print(slice(lst, 2, 5))
print(slice(lst, -100, 100))

运行结果为:

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

如果有了步长之后,上面的规则就会发生变化。接下来加入步长的slice实现:

def slice(lst, start=0, stop=0, step=1):ret = []if stop < 0:tmp = startstart = tmpstop = startcurrent = startwhile current < stop:try:ret.append(lst[current])except IndexError:passcurrent += stepreturn ret

切片的一些常用操作:

>>> lst = list(range(0, 10))
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> lst[:] # 等效于copy方法

>>> lst[-5:-3] # 支持负数索引

# start大于等于stop时,返回空列表
>>> lst[3:1]

# 列出偶数,步长为2
lst[::2]
[0, 2, 4, 6, 8]

# 列出偶数,步长为2,并倒序输出
lst[::2][::-1]
[8, 6, 4, 2, 0]

# 列出奇数,步长为2,并倒序输出
lst[::-2]
[9, 7, 5, 3, 1]

# 列出偶数,步长为2,并倒序输出
lst[-2::-2]
[8, 6, 4, 2, 0]

索引

如果索引超出范围,将引发IndexError的异常。修改元素的时候,如果超出索引范围,也同样引发IndexError异常。

  • index(value)方法根据value找索引
  • count(value)方法统计value出现的次数

enumerate的实现:

def enumerate(iterator):i = 0for v in iterator:yield i, vi += 1def enumerate(iterator):ret = []i = 0for v in iterator:ret.append((i, v))i += 1return ret

引用

列表批量赋值:

## 当赋值的序列连续时
# 对切片赋值,会替代原来的元素
>>> lst = list(range(0, 10))
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst[3:5] = ['x', 'y', 'z']
>>> lst
[0, 1, 2, 'x', 'y', 'z', 5, 6, 7, 8, 9]
>>> lst = list(range(0, 10))
>>> lst[3:5] = ['x']
>>> lst
[0, 1, 2, 'x', 5, 6, 7, 8, 9]
>>> lst = list(range(0, 10))
>>> lst[3:5] = 'x'
>>> lst
[0, 1, 2, 'x', 5, 6, 7, 8, 9]
## 当赋值的序列不连续时
>>> lst = list(range(0, 10))
>>> lst[3:8:2] = ['x', 'y', 'z']
>>> lst
[0, 1, 2, 'x', 4, 'y', 6, 'z', 8, 9]
>>> lst = list(range(0, 10))
>>> lst[3:8:2] = ['x']
ValueError: attempt to assign sequence of size 1 to extended slice of size 3
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

不建议使用以上的方式对切片赋值的操作

解包/封包

解构与封装可以叫做解包与封包。

  • 解构把集合里的元素复制给变量;
  • 封装是用变量构建元组。

解构:按照元素顺序,把线性解构的元素依次赋值给变量。

封装的例子:

t = 1, 2
print(t)
(1, 2)print(type(t))
<class 'tuple'>

定义一个元组,可以省略小括号。

t1 = (1, 2)
t2 = 1, 2
print(t1 == t2) // t1与t2是等效的
True

封装出来的是元组。封装没有什么难度。解构的变化多样,接下来重点看看解构。

先看一个例子:

In [29]: def swap(a, b):...:     i = a...:     a = b...:     b = i...:     return (a, b)...: In [30]: swap(1, 3)
Out[30]: (3, 1)

对上面的代码进行改写,由3行代码,变成了一行代码:

In [31]: def swap(a, b):...:     a, b = b, a...:     return (a, b)...: In [32]: swap(1, 3)
Out[32]: (3, 1)

对于如下的代码操作,就是解包:

In [33]: x, y = (1, 3)In [34]: x
Out[34]: 1In [35]: y
Out[35]: 3

上面的代码使用的是元组,列表也是可以的:

In [36]: a, b = 1, 3In [37]: a
Out[37]: 1In [38]: b
Out[38]: 3

接下来看一下封包:

In [39]: t = 1, 3In [40]: t
Out[40]: (1, 3)In [41]: type(t)
Out[41]: tuple

继续看例子:

In [42]: head, tail = list(range(0, 10))
# 将会得到如下的错误,因为=两边的元素数量不一致导致的
ValueError: too many values to unpack (expected 2)In [43]: head, *tail = list(range(0, 10))In [44]: head
Out[44]: 0In [45]: tail
Out[45]: [1, 2, 3, 4, 5, 6, 7, 8, 9]In [46]: *head, tail = list(range(0, 10))In [47]: head
Out[47]: [0, 1, 2, 3, 4, 5, 6, 7, 8]In [48]: tail
Out[48]: 9

如果对一个含有2个元素的列表进行解包:

In [49]: head, *tail = [1, 2]In [50]: head
Out[50]: 1In [51]: tail
Out[51]: [2]

如果对一个含有一个元素的列表进行解包:

In [52]: head, *tail = [1]In [53]: head
Out[53]: 1In [54]: tail
Out[54]: []

如果对一个空列表进行解包:

In [55]: head, *tail = []
ValueError: not enough values to unpack (expected at least 1, got 0)

针对上述例子的总结:

  1. 左边不能只有一个星号,还要有其他元素
  2. 如果左边不用星号,那么左边的元素个数要与右边的元素个数相同
  3. 左边变量数小于右边元素个数,且左边没有加星号会报错
  4. 元素按照顺序赋值给变量
  5. 变量和元素必须匹配
  6. 加星号变量,可以接收任意个数的元素
  7. 加星号的变量不能单独出现

针对上述,写一个具体的例子:

def it(lst):if lst:head, *tail = lstprint(head)it(tail)it(list(range(0, 10)))
0
1
2
3
4
5
6
7
8
9

更复杂一点的例子:

In [63]: head, *tail = [1, 2, 3]In [64]: head
Out[64]: 1In [65]: tail
Out[65]: [2, 3]

下面这个例子,在Python2中不能实现:

In [59]: head, *mid, tail = [1, 2, 3, 4, 5]In [60]: head
Out[60]: 1In [61]: mid
Out[61]: [2, 3, 4]In [62]: tail
Out[62]: 5

接下来还有更好玩的,如果我们要丢弃=右边某个值,可以使用下划线来,演示如下:

In [66]: lst = list(range(0, 10))In [67]: lst
Out[67]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]In [68]: a, b, _, c, *_ = lstIn [69]: a
Out[69]: 0In [70]: b
Out[70]: 1In [71]: c
Out[71]: 3

如果我们只想要序列的首位两个元素,可以这样操作:

In [72]: head, *_, tail = lstIn [73]: head
Out[73]: 0In [74]: tail
Out[74]: 9

再来一发,两边结构要一样:

In [75]: lst = [1, [2, 3], 4]In [76]: a, (b, c), d = lstIn [77]: a
Out[77]: 1In [78]: b
Out[78]: 2In [79]: c
Out[79]: 3In [80]: d
Out[80]: 4

对上面的例子,再来稍微变化一下,不过两边的结构要一样,解构是支持多层次的。:

In [81]: lst = [1, [2, 3, 4, 5, 6, 8], 9]In [82]: lst
Out[82]: [1, [2, 3, 4, 5, 6, 8], 9]In [83]: a, (b, *_, c), d = lstIn [84]: a
Out[84]: 1In [85]: b
Out[85]: 2In [86]: c
Out[86]: 8In [87]: d
Out[87]: 9

注意:

  • 解包的时候,两边的结构要一致 (重要的事情说三遍)
  • 解包的时候,两边的结构要一致 (重要的事情说三遍)
  • 解包的时候,两边的结构要一致 (重要的事情说三遍)
  • 只要两边结构一样就行
>>> a, (b, (c, (d,))) = [1, [2, [3, [4]]]]
>>> a
1
>>> b
2
>>> c
3
>>> d
4

python的一个惯例,使用单个下划线表示丢弃该变量。单个下划线也是Python合法的标识符,但是如果不是要丢弃一个变量,通常不要用单个下划线表示一个有意义的变量。

head, *_ = 'I love python'
print(head)
I
key, *_, value = 'env = properties'.partition('=')
print(key)
env
print(value)
properties

非常复杂的数据结构,多层嵌套的线性结构的时候,可以用解构快速提取其中的值。

版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任
python内置数据结构
本文转自    bigstone2012   51CTO博客,原文链接:http://blog.51cto.com/lavenliu/2044036

005-Python之列表,元组,字符串,bytes及bytearray共有操作相关推荐

  1. python序列—列表,元组,字符串

    目录 一.  1.列表语法 2.列表切片 3.列表的使用--增/删/改 1.增 2.删 3.改 4.列表的运算 5.列表的嵌套 访问 6.列表的拷贝 浅拷贝 深拷贝 7.列表推导式 基本语法 获取元素 ...

  2. python实验二序列_python 学习笔记 二 序列, 列表, 元组, 字符串

    序列 序类是一个集合概念, Pthon包括六种内建序列: 列表, 元组, 字符串, Unicode字符串, buffer对象和xrange对象. 其中, 我们最长用的要数前三个. 通用序列操作 1. ...

  3. Python中列表和字符串的反转

    要求: 原列表:[13, 30, 42, 85, 9, 45] 反转后的列表:[45, 9, 85, 42, 30, 13] 原字符串:hello 反转后的字符串:olleh Python现成的反转功 ...

  4. 手写Python中列表和字符串的反转

    要求: 原列表:[13, 30, 42, 85, 9, 45] 反转后的列表:[45, 9, 85, 42, 30, 13] 原字符串:hello 反转后的字符串:olleh Python现成的反转功 ...

  5. python中列表 元组 字典 集合的区别

    参考文章:python中列表 元组 字典 集合的区别

  6. python随机数列表变成字符串_Python循环、随机数、列表、元组、字符串、集合、jieba分词...

    Python中的循环 while循环: while 循环条件: (4个空格)循环体 计算1-100 之间的累加和 sum_num = 0 i = 1 while i <= 100: #对coun ...

  7. python入门——列表+元组+字典+集合

    列表 列表是最常用的python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 1.列表嵌套(相当于二维数组) a=["b",'c','d'] ...

  8. python将列表转换为字符串_每日一课 | Python将文件读入列表

    读取日志文件的Python示例,一行一行地进入列表. # With '\n', ['1\n', '2\n', '3'] with open('/www/logs/server.log') as f: ...

  9. python输出举例_python字符串格式化输出及相关操作代码举例

    字符串的格式化 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中.在   Python 中,字符串格式化使 ...

最新文章

  1. 《R in Action》读书笔记(1)
  2. 基于Python的频谱分析(二)——频谱泄露
  3. Linux磁盘格式化和挂载
  4. Java 实现日期 Date 的赋值
  5. 服务熔断、降级、限流、异步RPC -- HyStrix
  6. 中英文标点符号切换的组合键_易混标点符号:一字线(—)、短横线(-)、浪纹线(~)...
  7. 用c语言编写名字用字母表示,如何用C语言编写自己的姓名和学号
  8. java 自动编译_Tomcat是否自动编译Java Servlet?
  9. 二阶齐次线性微分方程的通解公式_高数大结局二阶常系数非线性齐次方程
  10. 转:.NET使用一般处理程序生成验证码!
  11. python趋势回归_Python 回归分析 - 树懒学堂
  12. JavaScript中变量的类型
  13. Ubuntu14.04安装wineqq国际版
  14. 虚拟摄像头之二: 配置v4l2loopback虚拟摄像头为前置或后置摄像头
  15. 交换式局域网_SWITCH交换模式
  16. python中成语接龙游戏_Python实现成语接龙
  17. 基于构件技术的流程银行,再造核心竞争力
  18. ca机构将会被区块链取代
  19. 【模拟】变态杀人狂(约瑟夫问题)
  20. 浏览器的选择建议,按照这些建议选,总能找到合适的

热门文章

  1. flask 配置文件
  2. GridView 导出为Excel
  3. java随机产生100个大小写字母_Java生成固定长度的随机字符串(以大小写字母和数字)...
  4. benchmarksql测试mysql_数据库压力测试工具 -- BenchmarkSQL 使用说明
  5. centos6.5mysql cluster 7.4.11_完美起航-MySQLMHA高可用集群部署及故障切换(图文详解)...
  6. c语言游戏call调用,C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)...
  7. springboot redis
  8. css定位页面元素,页面元素定位-CSS元素基本定位
  9. html 标签开发,前端开发入门之HTML基础标签一
  10. php 位深度,javascript - 流程图获取深度,求各位算法高手帮帮忙