一、 数据结构和序列
元组tuple
创建
- 长度固定、不可改变,但是元组中的对象可能是可变对象
- 创建方式:直接用英文逗号隔开,带上圆括号
- 若元组中只有一个元素,最后必须带上英文逗号
- 元组中元素的访问,索引从0开始
tuple2 = ((1,2,3),4, [1,3,9])
tuple2
((1, 2, 3), 4, [1, 3, 9])
tuple3 = (2,) # 单个元素带上英文逗号
tuple3
(2,)
![](https://img.haomeiwen.com/i5142014/3e730fe6fbd6070b.png)
迭代器转成元组
tuples()是一个函数,可以将任意的序列(比如字符串、列表等)转成元组形式
tuple([1,3,4]) # 将列表转成元组
(1, 3, 4)
tuple("python") # 将字符串转成元组
('p', 'y', 't', 'h', 'o', 'n')
![](https://img.haomeiwen.com/i5142014/b49551f1e027a13d.png)
元组操作
tuple2[2] # 访问元组中的元素
[1, 3, 9]
tuple2[2].append(8) # 元组中的列表进行增添元素操作
tuple2
((1, 2, 3), 4, [1, 3, 9, 8])
("python", "java") + (0, 9) + ([1,2,3], "php") # 多个元组相加
('python', 'java', 0, 9, [1, 2, 3], 'php')
("python", 2) * 4 # 复制串联功能
('python', 2, 'python', 2, 'python', 2, 'python', 2)
拆分元组
如果想将元组赋值给类似元组的变量,Python
会拆分等号
两边的值
>>tuple5 = (1, "python", [2,1,4])
>>a, b, c = tuple5
>>c
[2, 1, 4]
![](https://img.haomeiwen.com/i5142014/5b1f98b4b52908b8.png)
>>tuple6 = (6, "python", (9, 3))
>>a, b, (c, d) = tuple6 # 左边变量的个数要和元组的len相同
>>c
9
Python中的变量互换
![](https://img.haomeiwen.com/i5142014/feb98437273884ba.png)
变量拆分用来迭代元组或者列表序
seq = [(1,2,3), (4,5,6), (7,8,9)]
for a,b,c in seq:
print("a={0} b={1} c={2}".format(a,b,c))
![](https://img.haomeiwen.com/i5142014/04230c06bebf04b8.png)
高级拆分功能
在Python3
中新增了高级的拆分功能,通过特殊语法*rest
来表示,多用于抓取任意长度列表的位置参数:
-
*rest
获取剩下所有的元组元素 -
rest
获取到的元素是列表形式 -
rest
部分是想舍弃的部分,名字不重要,许多程序员用下划线表示*_
values = 1, 3, 9, 8, 4
a, b, *rest = values # 利用三个参数分配所有的元组对象
a, b # 每个变量一个元组对象
(1, 3)
rest # 剩下的全部是rest的,是列表形式
[9, 8, 4]
![](https://img.haomeiwen.com/i5142014/e09623cf286d6062.png)
tuple7 = (1,2,3,5,1,3,8,3)
tuple7.count(3) # 统计某个对象出现的次数
3
- 按下
tab
键能够查看对象的方法:index()
和count()
image.png
列表list
特点
- 长度可变、内容可修改
- 用
[]
表示,或者通过list()
函数直接生成 - 通过
list()
函数将元组转成列表:tuple--->list
list1 = [1,3,[1,0,4], "python"] # 列表里面的对象是任意的数据类型
list2 = list((1,2,3,4)) # 将元组转成列表通过list()函数
list3 = list(range(5)) # 将range函数生成的对象通过list()函数转成列表
![](https://img.haomeiwen.com/i5142014/39737b716c30193b.png)
list操作
在笔者第一篇札记中有详细的list
知识,请参考Python札记1_list列表
- append():
末尾
追加元素 - insert(i, object):指定位置索引为
i
追加;消耗计算量大 - pop(i):
参数是索引
,返回指定位置的元素 - remove(object):删掉找到的
第一个
对象 -
extend():追加多个元素,单个添加
image.png
![](https://img.haomeiwen.com/i5142014/49a3913e829f9456.png)
attention注意:在列表中查找比字典和集合中要慢
- 列表是
线性
搜索查找 - 字典和集合在同样的时间内可以查找其他项,例如:哈希表
extend的方法比串联(使用+)的方法要快:将所有的元素追加到一个大的列表中
list1 = []
list2 = [[4,8,9],["shenzhen","suzhou"],["python","java"]]
for i in list2:
list1.extend(i) #extend方法,快
print(list1)
list1 = []
list2 = [[4,8,9],["shenzhen","suzhou"],["python","java"]]
for i in list2:
list1 = list1 + i # +串联方法,慢
print(list1)
结果:
[4, 8, 9, 'shenzhen', 'suzhou', 'python', 'java']
- list.sort():原地排序,不生成新的列表
- sorted(list):生成新的对象
list3 = [1,9,3,2,5]
list3.sort()
list3
list4 = sorted(list3) # 默认从小到大,reverse=True:改成从大到小
list4
结果
[1, 2, 3, 5, 9]
根据长度key
进行排序
list5 = ["python", "java", "c", "javascript", "html", "c++"]
list5.sort(key=len) # 根据长度排序
list5
结果:
['c', 'c++', 'java', 'html', 'python', 'javascript']
二分搜索bisect
bisect
模块支持二分查找,和向已知排序的列表插入值。
-
bisect.bisect
可以找到插⼊值后仍保证排序的位置;参数是插入值,返回值是索引值 -
bisect.insort
是向这个位置插⼊值:参数是插入值也是索引值
import bisect
list6 = [1,2,2,2,3,6,7,9]
bisect.bisect(list6,2) # 插入元素2,按照顺序排列。如果有2,排序最后,返回的是索引值 # 结果4
bisect.bisect(list6,8) # 插入8,返回的是索引值 #结果7
bisect.insort(list6,5) # 索引值为5的位置插入5
list6
[1, 2, 2, 2, 3, 5, 6, 7, 9]
列表切片
切片的基本形式为[start:stop:step]
- 包含
start
,不包含stop
- 步长左边默认是
1
,右边默认是-1
- 左边索引值是从0开始,右边从-1开始
-
start
和stop
可以省略,省略之后默认是头部和尾部 - 如果
start
或者stop
是负数,表示右边开始切片 -
[::-1]
:表示反转列表
![](https://img.haomeiwen.com/i5142014/a8e16442bc1d6470.png)
序列函数
https://www.cnblogs.com/sesshoumaru/p/6140987.html,这位博主对于内置函数的总结非常棒!感兴趣的去学习下。在Python有常见的序列函数:
- sorted:默认是从小到大排序
- enumerate:返回序列的索引值和元素
- zip:多个序列的合并,通过list显示
- reversed:从大到小排序,reversed是一个生成器,必须实例化之后才能进行翻转。
- sorted:从任意序列的元素中返回一个排好序的列表,
得到的是列表list
sorted([1,4,2,9,5,8])
[1, 2, 4, 5, 8, 9]
![](https://img.haomeiwen.com/i5142014/6d9ad6529e185fb1.png)
![](https://img.haomeiwen.com/i5142014/46efc36ee5eddbc7.png)
- enumerate:返回的是(i, value)元组序列
list7 = ["python", "java", "html", "Ruby"]
dict1 = { }
for k, v in enumerate(list7):
dict1[v] = k
print(dict1)
{'python': 0, 'java': 1, 'html': 2, 'Ruby': 3}
![](https://img.haomeiwen.com/i5142014/0db14282c5860364.png)
- zip:将多个元组、列表或者序列组合成一个
新的元组
。sequence--->tuple
。生成的长度取决于最短的序列长度。
list9 = ["python", "java", "html"]
list10 = ["shenzhen", "suzhou","zhuhai"]
zipped = zip(list9, list10) # 得到zip对象
list(zipped) # 通过列表进行展示
[('python', 'shenzhen'), ('java', 'suzhou'), ('html', 'zhuhai')]
![](https://img.haomeiwen.com/i5142014/eec99f4874bac302.png)
zipped2 = zip(list1,tuple2,seq) # 生成新序列的长度取决于最短的序列。seq长度为2
list(zipped2)
[(1, 9, False), (9, 8, True)]
![](https://img.haomeiwen.com/i5142014/5d6fc8d2d6ad7538.png)
zip和enumerate联用
list1 = ["python","java","html"]
list2 = [9,6,2]
for a, (b,c) in enumerate(zip(list1, list2)): # 先zip合并,再enumerate同时取索引和元素
print("{0}:{1} {2}".format(a, b, c))
结果:
0:python 9
1:java 6
2:html 2
![](https://img.haomeiwen.com/i5142014/ada1e3e317c1bca0.png)
zip进行解压
zip函数有一种类似于zip的功能,用来解压序列。
list3 = [("python", 0), ("html", 1), ("java", 2), ("javascript", 3)]
vlaues, numbers = zip(*list3)
values
结果
('python', 'html', 'java', 'javascript')
![](https://img.haomeiwen.com/i5142014/ba4912b780ee8b47.png)
- reversed
reversed()从后向前迭代一个序列,从大到小
list(reversed(range(10))) # 进行翻转
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
字典dictionary
特点
- 也称之为哈希映射或者关联数据表
- 键值对是可变集合
- 键、值都是Python对象
- { }表示,用冒号隔开键和值
操作方法
- 创建{}
- 访问\增加:dict[key] = value,有则访问,无则增加
- del dict[key] :删除键值对
- dict.pop(key):删除键值对、返回值是value
- dict1.update(dict2):将两个字典合并
-
keys()、values()、items():访问字典中的键、值或者键值对
image.png
![](https://img.haomeiwen.com/i5142014/33365cdeae365c62.png)
![](https://img.haomeiwen.com/i5142014/8d048e3ec1927596.png)
多种创建方法
字典的创建是非常灵活的,方式多种多样:
- {}大括号直接创建
dict1 = {"python": "shenzhen", "html":"shanghai", "java":"beijing","zhuhai":[1,2,6]}
dict1 # 创建字典
- 通过序列创建
keys = ["python", "java", "html"]
values = (1,4,6)
dict3 = {}
for key, value in zip(keys, values):
dict3[key] = value
print(dict3)
- 字典本质上是2元元组的集合,接受2元元组的列表:
dict4 = dict(zip(list(range(5)),reversed(range(5))))
dict4
{0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
网友评论