Python有四种数据结构,这里再加上字符串,所以共有五种:
字符串(string)、列表(list)、元组(tuple)、字典(dictionary)和集合(set)。
加上字符串是因为它与其它数据结构有些相似的地方,放进来一起讲比较方便。
一、定义方法
字符串用引号
例如:name='Swaroop'
列表用方括号
例如:shoplist=['apple','mango','carrot','banana']
元组用圆括号
例如:zoo=('python','elephant','penguin')
但元组在定义时,也可以不用括号,例如:
Number=1,2,3,4,5
特别地,如果元组中只有一个元素,它后面需要一个逗号
例如:aNumber=1,
当用print输出时,元组有圆括号,所以,用圆括号括住是常规状态。
字典用花括号
例如:ab={
'Swaroop':'swaroop@swaroopch.com',
'Larry':'larry@wall.org',
'Matsumoto':'matz@ruby-lang.org',
'Spammer':'spammer@hotmail.com'
}
字典的每个元素有两个成份:键值和值。在定义时要成对地指定键值与值(前面的是键值,后一个是值)。
每一对之中用冒号隔开,各对用逗号隔开。
集合用set()方法
这是与前面的数据结构都不一样的地方。
例如:bri = set(['brazil', 'russia', 'india'])
注意参数的形式跟列表一样。
二、分类
1 可变与不可变
列表、字典和集合是可变的。它们的元素可以修改,可以添加、删除元素。
字符串和元组是不可变的,里面的元素不可以修改,也不可以添加、删除元素。
2 序列与非序列
列表、元组和字符串是序列。
序列同时具有三个特点:
(1)in和not in运算符测试元素资格(在与不在)。
(2)有索引操作,可以直接获取序列中的元素。
(3)有切片操作,取序列中的一部分。
字典和集合不是序列。
字典和集合都有(1),但没有(2)和(3)
三、访问元素的方法
序列可以用数字下标访问元素,非序列不可以用这种方法。
字典,用键值访问值,例如:ab['Swaroop']。
集合不可以访问到里面的元素。
四、删除
1 都可以整体删除,用del
2 列表、字典和集合都可以删除其中的元素,字符串和元组不可以。
(1)列表用del删除元素,例如:del shoplist[0]
(2)字典用del删除元素,例如:del ab[’Spammer’]
(3)集合用remove方法,例如:bri.remove(’India’)
五、添加成员
元组和字符串不可变,所以不能添加成员。
1 列表,用append()方法
例:shoplist.append('rice')
2 字典,直接输入
例:ab['Guido']='guido@python.org'#添加成员
3 集合,用add()方法
例:bric.add('china')
六、都可以用print方法整体输出
1 字符串显示内容,没有引号
2 列表要显示方括号
3 元组要显示圆括号
4 字典要显示花括号
5 集合要显示花括号(注意它定义时,参数用的是方括号)
七、赋予变量和产生副本
1 字符串名如果赋予另一个变量,会产生一个副本。没有两个变量指向同一个字符串的情况。
2 元组名赋予另一个变量,会产生一个副本。没有两个变量指向同一个元组的情况。
3 列表名赋予一个变量,则它们指向同一个列表,并没有产生新的列表。也就是说,这个列表有了两个名字。
要产生副本,使用切片操作。例如:
s=shoplist[:]
4 字典名赋予另一个变量,它们指向同一个字典。要产生副本,使用copy()方法。例如:
a=ab.copy()
5 集合名赋予另一个变量,它们指向同一个集合。要产生副本,使用copy()方法。例如:
b=bri.copy()
八、元素个数都用方法len()
九、遍历
五种数据结构都可以使用遍历,方法类似。
注意字典的一个元素有两个成分。
for item in shoplist:#shoplist是一个列表
print(item,end=' ')
for item in zoo:#zoo是一个元组
print(item,end=' ')
for item in name:#name是一个字符串
print(item,end=' ')
for n,a in ab.items():#name是一个字典
print('Contact {} at {}'.format(n,a))
for x in bri:#bri是一个集合
Print(x)
十、切片运算(序列具有)
参数用方括号表达一个区间。
1 完整参数
方括号里面有三个数值,用冒号隔开。
第一、二个是下标,给出一个左闭右开的区间,即从第一个下标开始,到第二个下标的前一个终止。
例如[1:3]的意义是1,2。
第三个数值的意义是步长,省略了就是1。例如[1:3]相当于[1:3:1]。
2 省略
方括号里面还可以省略到一个数值和没有数值,但冒号必不可少。
一个数值的例子:[2:],意义是从下标2到最后,步长为1。
没有数值的例子:[:],意义是全部,步长为1。
3 步长的正负及与区间方向的配合
步长可以为正,也可以为负。为正表示从下标从小到大,为负表示从大到小。前面两个数值也表达了方向,这两个必须一致,否则没有结果。
例如,[1:3]是1,2,而[1:3:-1]则没有结果。因为前面是从小到大,而步长表达是从大到小,写成[3:1]就有结果,为3。
4 负下标
-1,是最后一个元素(0是最前面一个)
负的下标,是从后面向前推进。
例如:
name=’Swaroop’
则name[-1]为p,name[1:-1]为waroo
十一、排序
列表用sort()方法,没有任何参数时是升序。
例如:
shoplist.sort()#升序
shoplist.sort(reverse=True)#降序
当然可以用reverse=False表示升序,但没有必要。
字符串和元组因为不可改变,不存在排序的问题。
集合没有顺序,字典用其它方法排序。
十二、连接运算
用字符串的join()方法
以下,定义字符串delimiter='_*_'
1 列表
例:
mylist=['Brazil','Russia','India','China']
print(delimiter.join(mylist))
结果:
Brazil_*_Russia_*_India_*_China
2 元组
例:
zoo=('python','elephant','penguin')
print(delimiter.join(zoo))
结果:
python_*_elephant_*_penguin
3 字符串
例:
name='swaroop'
print(delimiter.join(name))
结果:
s_*_w_*_a_*_r_*_o_*_o_*_p
4 字典
把键值连接起来,跟值无关。
例:
ab={
'Swaroop':'swaroop@swaroopch.com',
'Larry':'larry@wall.org',
'Matsumoto':'matz@ruby-lang.org',
'Spammer':'spammer@hotmail.com'
}
print(delimiter.join(ab))
结果:
Swaroop_*_Larry_*_Matsumoto_*_Spammer
5 集合
例:
bri = set(['brazil', 'russia', 'india'])
print(delimiter.join(bri))
结果:
india_*_brazil_*_russia
十三、其它
1 元组在定义时,如果只有一个元素,由其后要用逗号
例如:singleton = 2, 或:singleton=(2,)
2 元组在定义时,可以用其它元组作元素
例如:
zoo=('python','elephant','penguin')
New_zoo='monkey','canmel',zoo
3 集合有判别超集的方法
例:print('bri是否为bric的超集:',bri.issuperset(bric))
4 集合的与运算
例:print('bri与bric重合的元素为:',bri & bric)
这个运算可以用intersection()方法代替:bri.intersection(bric)