一、字典
定义:
1.字典是容器类型(序列),以键值对作为元素(字典里面存的数据全是以键值对的形式出现的)
形式:{key1:value,key2:value2.....}
2.键值对: 键:值(key:value)
键(key):要唯一,不可变的(数据类型,布尔,字符串和元祖;推荐使用字符串)
值(value):可以不唯一,可以是任何类型的数据
3.字典是可变(增删改) ---> 指的是字典中的键值对的值和个数可变
4.{}(空列表也是列表)
基本操作
1.声明变量
dict1 = {4:2,'a':5,True:'布尔',(10,12):'start'}
print(dict1)
结果:{4: 2, 'a': 5, True: '布尔', (10, 12): 'start'}
person1 = ['魏世强',23,'男']
person2 = {'name':'魏世强','age':23,'sex':'男'}
print(person1,person2)
结果:['魏世强', 23, '男'] {'name': '魏世强', 'age': 23, 'sex': '男'}
dict3 = {}
print(type(dict3))
<class 'dict'>
2.查(获取值)
定义:
获取字典的元素对应的值(字典存数据,实质存的是value,key是获取value的手段)
a.字典[key] ---> 通过key来获取值
通过字典[key]获取value的时候,如果key不存在会发生keyerror异常
person1 = {'name':'魏世强','age':23,'sex':'男'}
print(person1['name'],person1['age'])
魏世强 23
b.字典.get(key)
字典.get(key),如果key不存在不会报错,返回None
print(person1.get('age'))
23
print(person1.get('height'))
None -- python中的特殊值,代表没有
总结:确定key肯定存在的时候用[ ]语法获取value。key值可能不存在,不存的时候不希望报错, 而是想要自己对它进行特殊处理的时候使用get获取value
练习:存储一个人的信息,如果没有性别就默认为男
person1 = {'name':'魏世强','age':23,'sex':'男'}
if person1.get('sex') != None :
print(person1['sex'])
else:
print('男')
c.遍历字典(遍历字典直接渠道是字典的所有的key值)
person1 = {'name':'魏世强','age':23,'sex':'男'}
for key in person1:
print(key) name age sex
print(person1[key]) 魏世强 23 男
3.改(修改key对应的value)
字典[ key ] = 新值
person1['name'] = '李涵'
print(person1)
{'name': '李涵', 'age': 23, 'sex': '男'}
4.增(添加键值对)
字典[ key ] = 值 (key本来不存在)
person1['weight'] = '80kg'
print(person1)
{'name': '李涵', 'age': 23, 'sex': '男','weight':'80kg'}
5.删(删除键值对)
a.del 字典[ key ]
b.字典.pop(key)
del person1['weight']
print(person1)
{'name': '李涵', 'age': 23, 'sex': '男'}
age1 = person1.pop('age')
person2 = {'age':age1}
print(person2,person1)
{'age': 23} {'name': '魏世强', 'sex': '男'}
二、字典相关的运算
1.字典不支持' + '和' * '
dict1 = {'a':10,'b':20} + {'c':30} #TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
print(dict1)
2.in 和 not in :判断key是否存在
computer = {'brand':'联想','color':'black'}
print('color' in computer)
True
3.len()
print(len(computer)) 2
4.字典.clear()
删除字典中所有的元素(键值对)
computer.clear()
print(computer)
{ }
5.字典.copy()
dict1 = {'a':1,'b':2}
dict2 = dict1 #将dict中的地址赋给dict2,两个变量指向同一块内存区域
dict3 = dict1.copy() #将dict1中的内存复制到一个新的内存区域中,然后将新的地址给dict3
dict1['a'] = 100
print(dict2) # {'a': 100, 'b': 2}
print(dict3) # {'a': 1, 'b': 2}
6.dict,fromkey(序列,默认值 = None)
将序列中的每一个值作为key,默认值为value创建一个新的字典
注意:默认值可以不写,但最多只能写一个值(类型不限)
print(dict.fromkeys('abcd',12)) # {'a': 12, 'b': 12, 'c': 12, 'd': 12}
print(dict.fromkeys(['name','age','sex'],[1,2])) # {'name': [1, 2], 'age': [1, 2], 'sex': [1, 2]}
7.字典.keys()
获取字典中所有的key,以列表的形式返回
dict1 = {'a':1,'b':2}
all_key = dict1.keys()
for key in all_key:
print(key) # a b
8.字典.values
获取字典中所有的value
all_value = dict1.values()
print(all_value) # dict_values([1, 2])
9.字典.items()
print(dict1.items()) #dict_items([('a', 1), ('b', 2)])
for key,value in dict1.items():
print(key,value) # a 1 b 2
10.字典.setdefault(key,默认值 = None)
给字典添加键值对。如果本身就存在,这个方法无作为
dict1 = {'a':1,'b':2}
dict1.setdefault('a','cc')
dict1.setdefault('dd')
print(dict1) # {'a': 1, 'b': 2, 'dd': None}
11.字典1.updata(字典2)
a.将字典2中的键值对更新到字典1中
b.更新方式:如果字典2的key,在字典1中是存在的,就字典2中的值去更新字典1中的值。不存在就添加到字典1中
dict1 = {'abc': 'a','ada':'b'}
dict1.update({'abc':1,'dada':3131})
print(dict1) # {'abc': 1, 'ada': 'b', 'dada': 3131}
三、字典和列表的组合
什么时候使用列表? 什么时候使用字典?
1.保存的多个数据是同一类型的时候,用列表
列如:声明一个变量保存所有的数学成绩,声明一个变量保存所有的学生信息
2.保存的多个数据的类型不同,就要字典
声明一个变量保存一个学生的信息
1.列表中有字典
student_system = [
{'name':'no1','age':18,'sex':'男','tel':119},
{'name':'no2','age':18,'sex':'女','tel':120}
]
# 取出第一个学生的电话
print(student_system[0]['tel']) # 119
2.字典中有列表
py_class = {'class_name': 'python1806',
'student':[
{'name' :'小明','age':18,'num':'001'},
{'name':'小红','age':19,'num':'002'},
{'name':'小刚','age':20,'num':'003'}
]
}
del_name = input('请输入你的名字:')
all_student = py_class['student']
for student_dict in all_student[:]:
if student_dict['name'] == del_name:
all_student.remove(student_dict)
print(py_class)
请输入你的名字:小红
{'class_name': 'python1806', 'student': [{'name': '小明', 'age': 18, 'num': '001'}, {'name': '小刚', 'age': 20, 'num': '003'}]}
四、集合
集合(set)
定义:
a.集合是python中一种容器类型;无序的,可变的,值唯一
b.和数学中的集合差不多
c.除了可变容器类型,其他的基本都行,数字、布尔、和字符串是可以的
1.声明一个变量
将其他的序列转换成集合,自带一个去重的功能
set1 = {1,'abc',10,100,1}
print(set1,type(set1))
{100, 1, 10, 'abc'} <class 'set'>
2.查(获取集合中元素)
a.集合是不能单独获取其中的某一种元素的
b.遍历获取每一个元素
for item in set1:
print(item) #100 1 10 abc
3.增(添加元素)
a.集合.add(元素)
b.集合1.update(集合2):将集合2中的元素,添加到集合1中
set1.add('sadad')
print(set1) # {1, 100, 10, 'sadad', 'abc'}
set1.update({1,2,3,325})
print(set1) # {1, 2, 3, 100, 325, 10, 'sadad', 'abc'}
4.删
a.集合.remove(元素)
b.集合.clear() 删除所有的元素
set1.remove('abc')
print(set1) # {1, 2, 3, 100, 325, 10, 'dafagsg'}
set1.clear()
print(set1) # set()
5.改(改不了)
6.数学相关的集合运算
a.判断包含的情况(判断值为布尔)
集合1 >= 集合2 : 判断集合1中是否包含集合2
集合1 <= 集合2 :判断集合2中是否包含集合1
print({1,2,3,4,5} >= {2,4,5}) # True
print({1,2,3,4,5} >= {2,4,5,6}) # False
b.求并集: |
set1 = {1,2,3,4,5,6,}
set2 = {1,2,3,14,15,16}
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 14, 15, 16}
c.求交集 :&
print(set1 & set2) # {1, 2, 3}
d.求差集: -
print(set2 - set1) # {16, 14, 15}
e.求补集: ^
求两个集合中除了公共部分以外的部分
print(set1 ^ set2) # {16, 4, 5, 6, 14, 15}
f. 字典转换为集合
注意:字典转换为集合后,集合只有存储字典的键并且无序。
dict1 = {'name':'魏世强','age':23}
set1 = set(dict1)
print(set1) # {'age', 'name'}
g.列表转换为集合
注意:列表转换为集合后,集合会存储列表所有的值并且无序
list1 = [1,2,'abc']
set1 = set(list1)
print(set1) #{1, 2, 'abc'}
网友评论