一list
Python内置的一种数据类型是列表:list,是一种有序的集合。
特性:
1: 用len()函数可以获得list元素的个数
2: 用索引来访问list中每一个位置的元素,记得索引是从0开始的:
3: 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素。
4: list是一个可变的有序表,所以,可以往list中追加元素,指定位置插入元素,删除元素,替换元素。append(), insert(), pop()
5: list里面的元素的数据类型也可以不同
6: list元素也可以是另一个list
例1:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
>>> len(classmates) //元素个数
3
>>> classmates[0]//有序列表
'Michael'
>>> classmates[-1] //倒数
'Tracy'
>>> classmates[len(classmates)-1]
'Tracy'
例2:
>>> classmates.append('Adam') //添加
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
>>> classmates.insert(1,'Jack') //插入
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
>>> classmates.pop(1) //删除
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
>>> classmates[2] = 'Sarah' //替换
>>> classmates
['Michael', 'Bob', 'Sarah', 'Adam']
例3:
>>> L = ['Apple', 123, True] //支持不同数据类型
>>> type(L[2])
<class 'bool'>
>>> type(L[1])
<class 'int'>
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[2]
['asp', 'php']
>>> s[2][0]
'asp'
二tuple
一种有序列表叫元组:tuple。
tuple和list非常类似,上面的12356特性都一样。但是tuple一旦初始化就不能修改
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
注意:python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
例4:
>>> t = ('Michael', 'Bob', 'Tracy')
>>> t[1]
'Bob'
>>> t = ('Michael')
>>> type(t)
<class 'str'>
>>> t = ('Michael',)
>>> type(t)
<class 'tuple'>
注意:最后来看一个“可变的”tuple:
例5:
>>> t = ('Michael', 'Bob', ['Tracy','Kate'])
>>> t[0]='Jerry' //不可变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t[2][0]='Jerry' //可变
>>> t
('Michael', 'Bob', ['Jerry', 'Kate'])
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
三dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储。
特性:
1: 具有极快的查找速度
2: 由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉。
3: 要删除一个key,用pop(key)方法,对应的value也会从dict中删除,添加,替换值,通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value。
4: 要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
5: 注意,dict内部存放的顺序和key放入的顺序是没有关系的。
例6
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael'] //查询
95
>>> d['Michael'] = 88 //赋值
>>> d['Michael']
88
例8
>>> 'Thomas' in d //判断key是否存在方法1
False
>>> 'Michael' in d
True
>>> d.get('Thomas') //返回None的时候Python的交互环境不显示结果。
>>> d.get('Thomas',-1)
-1
>>> d.get('Thomas',False) //判断key是否存在方法2
False
>>> d.get('Michael',False)
88
例7
>>> d.pop('Bob') //删除
75
>>> d
{'Michael': 88, 'Tracy': 85}
>>> key = [1, 2, 3] //添加不可变key
>>> d[key] = 'a list'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> key = 1
>>> d[key] = 'int'
>>> d
{'Michael': 88, 'Tracy': 85, 1: 'int'}
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢,dict是用空间来换取时间的一种方法
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
四 set
set和dict类似,也是一组key的集合,但不存储value。要创建一个set,需要提供一个list作为输入集合。
特性:
1: 重复元素在set中自动被过滤
2: 通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果
3: 通过remove(key)方法可以删除元素
4: set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
例8
>>> s = set([1,2,3]) //初始化
>>> s
{1, 2, 3}
>>> s = set([1,2,2,1,3,[1,1,2]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list' //可变对象list不可以作为set元素
>>> s = set([1,2,2,1,3])
>>> s
{1, 2, 3} //不重复
>>> type(s)
<class 'set'>
>>> s[1] //没有顺序
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
例9
>>> s.add(4) //添加
>>> s
{1, 2, 3, 4}
>>> s.add(1)
>>> s
{1, 2, 3, 4}
>>> s.remove(4) //删除
>>> s
{1, 2, 3}
>>> s
{1, 2, 3}
>>> s2 = set([1, 3, 4]) //做集合运算
>>> s & s2
{1, 3}
>>> s | s2
{1, 2, 3, 4}
注意:
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。由于key不能重复,所以,在set中,没有重复的key。而list, tuple都可以又重复的元素。显示的顺序也不表示set是有序的。
五 不可变对象
str是不变对象,而list是可变对象
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,
而对于不可变对象,比如str,对str进行操作呢
例10
>>> tuple1 = (1,2,3) //全是不是变元素的tuple可以作为dict和set的元素
>>> tuple1
(1, 2, 3)
>>> type(tuple1)
<class 'tuple'>
>>> s.add(tuple1)
>>> s
{1, 2, 3, (1, 2, 3)}
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d[tuple1] = 99
>>> d
{'Michael': 95, 'Bob': 75, 'Tracy': 85, (1, 2, 3): 99}
>>> tuple2 = (1, [2, 3]) //包含可变对象的元素的tuple不可以作为dict和set的元素
>>> tuple2
(1, [2, 3])
>>> type(tuple2)
<class 'tuple'>
>>> s.add(tuple2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> d[tuple2] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'