一、 数据结构和序列
元组tuple
创建
- 长度固定、不可改变,但是元组中的对象可能是可变对象
- 创建方式:直接用英文逗号隔开,带上圆括号
- 若元组中只有一个元素,最后必须带上英文逗号
- 元组中元素的访问,索引从0开始
tuple2 = ((1,2,3),4, [1,3,9])
tuple2
((1, 2, 3), 4, [1, 3, 9])
tuple3 = (2,) # 单个元素带上英文逗号
tuple3
(2,)
迭代器转成元组
tuples()是一个函数,可以将任意的序列(比如字符串、列表等)转成元组形式
tuple([1,3,4]) # 将列表转成元组
(1, 3, 4)
tuple("python") # 将字符串转成元组
('p', 'y', 't', 'h', 'o', 'n')
元组操作
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]
>>tuple6 = (6, "python", (9, 3))
>>a, b, (c, d) = tuple6 # 左边变量的个数要和元组的len相同
>>c
9
Python中的变量互换
变量拆分用来迭代元组或者列表序
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))
高级拆分功能
在Python3
中新增了高级的拆分功能,通过特殊语法*rest
来表示,多用于抓取任意长度列表的位置参数:
-
*rest
获取剩下所有的元组元素 -
rest
获取到的元素是列表形式 -
rest
部分是想舍弃的部分,名字不重要,许多程序员用下划线表示*_
values = 1, 3, 9, 8, 4
a, b, *rest = values # 利用三个参数分配所有的元组对象
a, b # 每个变量一个元组对象
(1, 3)
rest # 剩下的全部是rest的,是列表形式
[9, 8, 4]
tuple7 = (1,2,3,5,1,3,8,3)
tuple7.count(3) # 统计某个对象出现的次数
3
- 按下
tab
键能够查看对象的方法:index()
和count()
列表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()函数转成列表
list操作
在笔者第一篇札记中有详细的list
知识,请参考Python札记1_list列表
- append():
末尾
追加元素 - insert(i, object):指定位置索引为
i
追加;消耗计算量大 - pop(i):
参数是索引
,返回指定位置的元素 - remove(object):删掉找到的
第一个
对象 -
extend():追加多个元素,单个添加
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://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]
- 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}
- zip:将多个元组、列表或者序列组合成一个
新的元组
。sequence--->tuple
。生成的长度取决于最短的序列长度。
list9 = ["python", "java", "html"]
list10 = ["shenzhen", "suzhou","zhuhai"]
zipped = zip(list9, list10) # 得到zip对象
list(zipped) # 通过列表进行展示
[('python', 'shenzhen'), ('java', 'suzhou'), ('html', 'zhuhai')]
zipped2 = zip(list1,tuple2,seq) # 生成新序列的长度取决于最短的序列。seq长度为2
list(zipped2)
[(1, 9, False), (9, 8, True)]
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
zip进行解压
zip函数有一种类似于zip的功能,用来解压序列。
list3 = [("python", 0), ("html", 1), ("java", 2), ("javascript", 3)]
vlaues, numbers = zip(*list3)
values
结果
('python', 'html', 'java', 'javascript')
- 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():访问字典中的键、值或者键值对
多种创建方法
字典的创建是非常灵活的,方式多种多样:
- {}大括号直接创建
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}
- 默认值
if key in dict: # 一种常见的逻辑
value = dict[key]
else:
value = default_value
字典中的get
和pop
方法可以取默认值并且返回,上面的if语句等效于:
value = dict.get(key, default_value) # get默认返回是None;如果没有pop会报错。
dict1 = {}
words = ["book","car", "apple", "cat", "boy", "blue", "as", "apply"]
for word in words: # 判断Word是否在words中
letter = word[0] # 取Word的首字母,根据首字母进行分类
if letter not in dict1: # 如果首字母的键不在字典中
dict1[letter] = [word] # 首字母作为键,值是word组成的列表
else: # 如果letter在字典的键中
dict1[letter].append(word) # dict1[letter] 作为列表进行追加元素word
结果:
{'b': ['book', 'boy', 'blue'],
'c': ['car', 'cat'],
'a': ['apple', 'as', 'apply']}
利用setdefault解决
- dict1.setdefault(letter, []):如果作为key的letter在字典dict1中,直接返回给定的键空列表
- 如果不在,返回的是后面的默认值,并且将指定的键值对更新到字典中
dict1 = {}
words = ["book","car", "apple", "cat", "boy", "blue", "as", "apply"]
for word in words:
letter = word[0]
dict1.setdefault(letter, []).append(word)
>>dict1
结果:
{'b': ['book', 'boy', 'blue'],
'c': ['car', 'cat'],
'a': ['apple', 'as', 'apply']}
dict1 = {'name': 'Peter', 'google': 'Google 搜索'}
print(dict1.setdefault('name', None))
print(dict1.setdefault('city', "shenzhen")
words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict2 = {}
for word in words:
letter = word[0]
dict2.setdefault(letter, []).append(word) # 首字母不在,则更新字典中的键值对
>>dict2
{'a': ['apple', 'autumn', 'as'],
'b': ['book', 'bag'],
'c': ['cook', 'car'],
'd': ['dog']}