仅仅提供基本数据类型是不够的,当处理超过一个整数、字符串等时,需要一种方式将他们组合起来,并且提供操作它们的方法。
Python提供list,tuple,set和dict类型,大大增强了数据表示的能力。它们有各自的特点和用场。
list:
list是一种有序的数据集合,可以对一个list对象进行插入、添加、替换操作,改变这个list对象的元素。
##########
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
classmates是一个list对象,包含三个元素,分别是Michael、Bob和Tracy。可以用索引访问list的每个元素:
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
下标是从0开始,最大是len(classmates)-1。通过append、insert、pop和赋值修改list的值。
#添加操作
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
#插入
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
#删除
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy'] #末尾删除
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy'] #通过pop带的参数,指定删除的下标
#替换
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
list的另一个特点是,它的元素不需要是同一个数据类型,并且可以嵌套,也就是其元素是另一个list。
#list元素不必是同样类型
>>> L = ['Apple', 123, True]
#list元素是另一个list
>>> p = ['asp', 'php']
>>> s = ['python', 'java', p, 'scheme']
要拿到'php'
可以写p[1]
或者s[2][1]
,因此s
可以看成是一个二维数组。
tuple:
而tuple形式上与list相似,通过下标查看数据,但是不允许修改,因此没有插入、添加和替换操作。tuple在初始化时就确定其元素了,之后就不允许再被修改了。
>>> t = (1, 2)
>>> t
(1, 2)
但有两点需要注意:
一、只包含一个元素时,t1 = (1,)方式定义,因为(1)表示1这个数,加逗号避免歧义;
二、如果tuple元素是list,由于list是可以修改的,那么该元素的内容是可以修改的。
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
这个tuple对象t包含三个元素,分别是'a', 'b'和一个list。tuple不可变是指t指向的元素不变,但是list的内容是可以修改的,通过下图说明更加清晰。
定义时的tuple元素:
当我们把list的元素'A'
和'B'
修改为'X'
和'Y'
后,tuple变为:
dict:
dcit全称dictionary,在其他语言里也叫map,用来表示键值对。查询速度非常快,因为它的键对应的值的存储位置是通过hash函数确立的,参数是键,所以一个dict内的键必须是唯一的,并且是不可变对象,如字符串、数字等。
#定义dict,通过键查询对应的值
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
#给dict中的元素赋值,如果不存在那么创建这个键值对,多次修改将改变对应的值
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
#如果要删除其中的对,可以通过pop(key)的方式删除
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而增加;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
set:
set与dict类似,但是不存储值,set元素也不能重复的。
#重复元素在set中过滤掉
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
set([1, 2, 3])
通过add增加元素:
#重复增加,不起作用,因为元素必须唯一
>>> s.add(4)
>>> s
set([1, 2, 3, 4])
>>> s.add(4)
>>> s
set([1, 2, 3, 4])
remove删除元素:
>>> s.remove(4)
>>> s
set([1, 2, 3])
#set对应于数学上的无序、唯一集合,可以进行交并运算
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
set([2, 3])
>>> s1 | s2
set([1, 2, 3, 4])