Python其实很简单第十章字典与集合
前面介绍的列表和元组都是有序序列,而字典与集合属于无序序列,也就是说,不能通过索引来操作元素。
10.1 字典
语法格式:
dictionary= {key1 : value1, key2 : value2, key3 : value3 ,...., key n : value n }
其中,dictionary是字典名称,key表示元素的键,value表示元素的值,键和值必须是成对的。
如:
>>> dict1 = { "abc": 123, 98.6: 37 }
>>> dict1
{"abc": 123, 98.6: 37}
可以看出,键可以是字符串、数字或者元组,但必须是唯一的;而值可以是任何数据类型,也没有要求是唯一的。
1、创建字典的方法
方法一:同时给定键和值,即"关键字参数"形式。
dictionary=dict(key1=value1,key2=value2,.....,key n=value n)
注意:这里的key 必须符合Python标识符的命名规则。
例:
先使用"{}"创建字典:
>>> dict1={1:"一",2:"二",3:"三",4:"四",5:"五"}
>>> dict1
{1: "一", 2: "二", 3: "三", 4: "四", 5: "五"}
再通过"关键字参数"形式创建:
>>> dict1=dict(1="一",2="二",3="三",4="四",5="五")
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
创建不成功,原因在于key 不符合Python标识符的命名规则。前面已经介绍过,标识符不能用数字表示或者用数字打头。
现在对键如下修改:
>>> dict1=dict(n1="一",n2="二",n3="三",n4="四",n5="五") #在数字前加了一个字符"n"
>>> dict1
{"n1": "一", "n2": "二", "n3": "三", "n4": "四", "n5": "五"}
方法二 :使用已经存在的元组和列表通过映射函数创建字典。
格式:dictionary=dict(zip(tuplekey,listvalue))
例:
>>> tuplekey=("n1","n2","n3","n4","n5") #键的序列采用元组
>>> listvalue=["一","二","三","四","五"] #值的序列采用列表
>>> dict1=dict(zip(tuplekey,listvalue))
>>> dict1
{"n1": "一", "n2": "二", "n3": "三", "n4": "四", "n5": "五"}
注意:tuple(listname)函数可以将列表转换为元组,list(tuplename)函数可以将元组转换为列表。
2、通过键访问字典
直接获取键的相应元素的值
>>> dict1["n2"]
"二"
利用get()方法
>>> dict1.get("n2")
"二"
get()方法也可以带参数,当要访问的键不存在时返回一个字符串。如:
>>> dict1.get("n0","can"t find!") #当要查找的键不存在,返回"can"t find!"
"can"t find!"
3、遍历字典
使用字典对象的items()方法可以获取字典的"键.值对"列表。
>>> for item in dict1.items():
print(item)
("n1", "一")
("n2", "二")
("n3", "三")
("n4", "四")
("n5", "五")
也可以获取具体的每个元素的键和值,如:
>>> for key,value in dict1.items():
print(key,"对应的是",value)
n1 对应的是 一
n2 对应的是 二
n3 对应的是 三
n4 对应的是 四
n5 对应的是 五
4、添加、修改和删除字典元素
使用下面的语句,若指定的键存在,就可以修改该元素的值;若指定的键不存在,则添加该元素。如:
>>> dict1["n6"]="六" # 键’n6’不存在,故添加该元素
>>> dict1
{"n1": "一", "n2": "二", "n3": "三", "n4": "四", "n5": "五", "n6": "六"}
>>> dict1["n4"]="肆" # 键’n4’存在,故修改该元素
>>> dict1
{"n1": "一", "n2": "二", "n3": "三", "n4": "肆", "n5": "五", "n6": "六"}
5、利用推导式建立字典
import random
dict1={i:random.randint(1,100) for i in range(5)}
# 生成元素的键为0到5整数,值为1到100之间的随机数
print(dict1)
运行结果:{0: 28, 1: 59, 2: 79, 3: 30, 4: 88}
10.2 集合
集合是数学中一个很重要的概念,集合具有确定性、互异性、无序性三个基本属性。在Python中,集合同样具有这三个基本属性,其中,确定性是指对象要么是集合的元素,要么不是集合的元素;互异性是指集合中的元素不能重复;无序性是指集合中的元素不分先后次序,可以随意更换位置。
1、集合的创建
直接使用"{}"创建
>>> set1={"春","夏","秋","冬"}
>>> set1
{"秋", "春", "冬", "夏"}
>>> set2={3,2,1,4,5}
>>> set2
{1, 2, 3, 4, 5}
利用已有的列表、元组创建集合
>>> list1=["东","南","西","北"]
>>> set3=set(list1)
>>> set3
{"南", "东", "北", "西"}
利用已有的集合建立一个"副本"
>>> set3
{"南", "东", "北", "西"} #set3和set4的值一样
>>> set4=set3
>>> set4
{"南", "东", "北", "西"}
>>> set4.add("中") #给set4添加元素
>>> set4
{"西", "中", "东", "南", "北"} # 这个好理解
>>> set3
{"西", "中", "东", "南", "北"} # 意想不到吧?Set3为什么会发生变化?
再看看简单变量的情况:
>>> a=2
>>> b=a #是不是与前面set4=set3相似
>>> b+=1
>>> b
3
>>> a
2 #但a的值并没有发生改变
从上面集合set3、set4和简单变量a、b的值的变化情况对比,不难发现set3和set4是指向同一地址的对象,而变量a和变量b指向了不同地址,语句b=a是将a的值传递个b,并不是将a的地址传递给b。列表、元组、字典都和集合一样具有这样的性质。
所以,将set4称为set3的"副本"更为恰当。
2、添加和删除元素
>>> set3
{"南", "东", "北", "西"}
>>> set3.add("中") # 添加元素
>>> set3
{"西", "中", "东", "南", "北"} # 集合内的元素是无序的,不要纠结次序的变化
>>> set3.remove("中") # 删除元素
>>> set3
{"西", "东", "南", "北"}
3、集合运算
集合运算包括交(&)、并(|)、差(-),和数学中的集合运算是一致的。
>>> set3={"南", "东", "北", "西"}
>>> set4={"西", "中", "东", "南", "北"}
>>> set3 & set4 #取set3和set4的交集
{"西", "南", "北", "东"}
>>> set3 | set4 #取set3和set4的并集
{"中", "南", "北", "西", "东"}
>>> set3 - set4 #取set3与set4的差,即set3比set4多出来的元素
set()
>>> set4 -set3 #取set4与set3的差,即set4比set3多出来的元素
{"中"}