回顾上次所学,简单了解了在Python中有返回值、无返回值、有参、无参的函数。本节将学习的是Python中的list, tuple, dict, set这种复合的高级数据类型。
1. List
list是一个有序集合。像Array一样可以在其后加入[x]的形式来访问其第x
个元素。其中x
可以为负数,当其为负数时表示倒数第几个。比如 list[-1] 表示list中倒数第一个元素。
List的相关操作函数
Method | Description |
---|---|
list.append(x) | 把一个元素添加到列表的结尾]。 |
list.extend(L) | 通过添加指定列表的所有元素来扩充列表。 |
list.insert(i, x) | 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。 |
list.remove(x) | 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。 |
list.pop([i]) | 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除 |
list.clear() | 移除列表中的所有项。 |
list.index(x) | 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。 |
list.count(x) | 返回 x 在列表中出现的次数。 |
list.sort() | 对列表中的元素进行排序。 |
list.reverse() | 倒排列表中的元素。 |
list.copy() | 返回列表的浅复制。 |
# List的使用
a = [66.66, 777, 777, 1, 131.13]
# count
print("a.count(777), a.count(66.66), a.count(2)")
print(a.count(777), a.count(66.66), a.count(2))
print(a)
# insert
print("a.insert(2, -1)")
a.insert(2, -1)
print(a)
# append
print("a.append(777)")
a.append(777)
print(a)
# index
print("a.index(777)")
print(a.index(777))
print(a)
# remove
print("a.remove(777)")
a.remove(777)
print(a)
# reverse
print("a.reverse()")
a.reverse()
print(a)
# sort
print("a.sort()")
a.sort()
print(a)
FANGQIdeMacBook-Pro:PythonStudy fangqi$ python3 ex16.py
a.count(777), a.count(66.66), a.count(2)
2 1 0
[66.66, 777, 777, 1, 131.13]
a.insert(2, -1)
[66.66, 777, -1, 777, 1, 131.13]
a.append(777)
[66.66, 777, -1, 777, 1, 131.13, 777]
a.index(777)
1
[66.66, 777, -1, 777, 1, 131.13, 777]
a.remove(777)
[66.66, -1, 777, 1, 131.13, 777]
a.reverse()
[777, 131.13, 1, 777, -1, 66.66]
a.sort()
[-1, 1, 66.66, 131.13, 777, 777]
2. Tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
>>> a = ('aaa', 'bbb', 'ccc')
现在,a这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,可以正常地使用a[0],a[-1],但不能赋值成另外的元素。
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
# tuple
a = (1, 2, 3, 1)
print("a.count(1), a.count(2), a.count(4)")
print(a.count(1), a.count(2), a.count(4))
print(a)
print("a[0], a[1], a[-2]")
print(a[0], a[1], a[-2])
print("a.index(3)")
print(a.index(3))
FANGQIdeMacBook-Pro:PythonStudy fangqi$ python3 ex17.py
a.count(1), a.count(2), a.count(4)
2 1 0
(1, 2, 3, 1)
a[0], a[1], a[-2]
1 2 3
a.index(3)
2
同List相比tuple的区别
- tuple不可以修改,但可以拼接 使用+操作符
- tuple不可以删除特定元素,但可以删除整个tuple ,使用del tuple
- tuple 方法只有index() 和 count()
3. Dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字,无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
dict就是第二种实现方式,给定一个名字,比如'Michael',dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。
你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
- del 操作
a = {'Name': 'xiao7', 'Age': 1, 'Class': 'First'}
del a['Name'] # 删除键 'Name'
print(a)
Python中dict包含了以下内置函数:
序号 | 函数 | 描述 |
---|---|---|
1 | len(dict) | 计算字典元素个数,即键的总数。 |
2 | str(dict) | 输出字典,以可打印的字符串表示。 |
3 | type(variable) | 返回输入的变量类型,如果变量是字典就返回字典类型。 |
Python中dict包含了以下内置方法:
序号 | 函数及描述 |
---|---|
1 |
radiansdict.clear() 删除字典内所有元素 |
2 |
radiansdict.copy() 返回一个字典的浅复制 |
3 |
radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 |
radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 |
key in dict 如果键在字典dict里返回true,否则返回false |
6 |
radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组 |
7 |
radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表 |
8 |
radiansdict.setdefault 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
9 |
radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 |
radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表 |
11 |
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。 |
12 |
popitem() 随机返回并删除字典中的一对键和值(一般删除末尾对)。 |
4. Set
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
>>> # 下面展示两个集合间的运算.
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
Python中set包含了如下内置函数:
序号 | 函数 | 描述 |
---|---|---|
1 | add() | 添加元素s.add("abc")
|
2 | update() | 添加元素s.update(abc)
|
3 | remove() | 移除元素s.remove(abc) 注:如果元素不存在则报错 |
4 | discard() | 移除元素s.discard(abc) 注:如果元素不存在不会报错 |
5 | pop() | 随机删除一个元素,并且返回其值x = s.pop()
|
6 | in | 判断是否存在x in s ,若存在返回True,不存在返回False |