Python学习日记(九)
字典
- 两个关系之间1:1的映射关系,映射类型。
- 创建和访问字典
-
- 利用大括号{}创建字典
>>> dict1={1:'yyl',2:'yu',3:'li'} >>> dict1 {1: 'yyl', 2: 'yu', 3: 'li'}
- 利用关键字dict参数创建字典,注意此时创建的字典的顺序可能会颠倒。此时键不能用引号。
- dict(键='值')
-
>>> dict2=dict(大大怪='将军',小小怪='下士') >>> dict2 {'大大怪': '将军', '小小怪': '下士'} >>> dict2['小小怪']='可爱' >>> dict2 {'大大怪': '将军', '小小怪': '可爱'} >>> dict2['开心超人']='高冷拽少' >>> dict2 {'大大怪': '将军', '小小怪': '可爱', '开心超人': '高冷拽少'}
- 利用大括号{}创建字典
- 字典的内置方法
-
- fromkeys(键)
- dict.fromkeys(s,[v]),其中是为键,v为键对应的值,可选,默认为none
- 不能单独更改键的值,v只能是一个参数,用他给每个键赋值
- 不能修改其中某几个键的值,他只会自动创建一个新的字典
- fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。
-
>>> dict1={} >>> dict1.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict1.fromkeys((1,2,3),'numbers') {1: 'numbers', 2: 'numbers', 3: 'numbers'} >>> dict1.fromkeys((1,2,3),('one','two','three')) {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')} >>> dict1.fromkeys((1,3),('one','two','three')) {1: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
-
- keys()
- 返回字典键的引用
-
>>> dict1=dict1.fromkeys(range(9),'赞') >>> dict1 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞'} >>> for eachkey in dict1.keys(): print(eachkey) 0 1 2 3 4 5 6 7 8
-
- values()
- 返回字典键对应的值
-
>>> for eachkey in dict1.values(): print(eachkey) 赞 赞 赞 赞 赞 赞 赞 赞 赞
- items()
- 以元组的形式打印字典的键值对
-
>>> for eachkey in dict1.items(): print(eachkey) (0, '赞') (1, '赞') (2, '赞') (3, '赞') (4, '赞') (5, '赞') (6, '赞') (7, '赞') (8, '赞')
- get()
- 通过dict.get(键号,[返回])可以得到键对应的值,其中第二个参数默认为none,可以自行设置,当要访问的键不存在时返回该值
-
>>> dict1.get(9,'不存在') '不存在' >>> dict1.get(8,'不存在') '赞'
- 可以用成员资格操作符in/not in判断键是否在字典中
>>> 8 in dict1 True >>> 9 in dict1 False
- clear()
- 清除字典
- 注意不可用空字典覆盖的方法清除字典,因为只是创建了一个新的同名空字典,原来字典还在,很容易被窃取数据。
-
>>> dict1.clear() >>> dict1 {} >>> dict1=dict1.fromkeys(range(9),'赞') >>> dict2=dict1 >>> dict1={} >>> dict2 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞'} >>> dict1=dict2 >>> dict1.clear() >>> dict2 {}
-
-
copy() 浅拷贝
- 注意赋值和浅拷贝的关系,赋值是给数据起了另外一个标签在相同数据上,浅拷贝是对对象表层的拷贝,所得结果和原来数据不是同一个,地址也不同。通过赋值的两个标签指向同一个数据,会相互影响,而copy的两个不会相互影响。
-
>>> dict1=dict1.fromkeys(range(6),'哈') >>> dict1 {0: '哈', 1: '哈', 2: '哈', 3: '哈', 4: '哈', 5: '哈'} >>> dict2=dict1 >>> dict3=dict1.copy() >>> id(dict1) 1895730658304 >>> id(dict2) 1895730658304 >>> id(dict3) 1895765883840 >>> dict1[0]='嘿' >>> dict1 {0: '嘿', 1: '哈', 2: '哈', 3: '哈', 4: '哈', 5: '哈'} >>> dict2 {0: '嘿', 1: '哈', 2: '哈', 3: '哈', 4: '哈', 5: '哈'} >>> dict3 {0: '哈', 1: '哈', 2: '哈', 3: '哈', 4: '哈', 5: '哈'}
-
-
-
pop()、popitem()
- dict.pop(键),弹出相应键的值;dict.popitem( ),无参数,随机弹出任意位置键值对,在字典中是没有一定顺序的
-
>>> dict1.pop(2) '哈' >>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈', 5: '哈'} >>> dict1.popitem() (5, '哈') >>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈'}
- setdefault()
- dict.setdefault(键,'值'),存在就不添加值
- 与get()类似,当字典中找不到对应值时会自行进行添加,添加位置也是随机的
-
>>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈'} >>> dict1.setdefault(0) '嘿' >>> dict1.setdefault(2,'芜湖') '芜湖' >>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈', 2: '芜湖'}
- update()
- update(字典或映射)
- 用一个字典或映射关系去更新另外一个字典
>>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈', 2: '芜湖'} >>> a={'小羊':'咩咩'} >>> dict1.update(a) >>> dict1 {0: '嘿', 1: '哈', 3: '哈', 4: '哈', 2: '芜湖', '小羊': '咩咩'}
-
集合(set)
- 用{}括起来的一组没有映射关系的数据称为集合
- 集合中所有的元素都是唯一的,可用于剔除重复元素
- 集合是无序的,不能索引集合中的某个元素
>>> s={1,2,3,4,5} >>> type(s)
>>> s={1,2,3,3,6,6,6,6} >>> s {1, 2, 3, 6} >>> s[2] Traceback (most recent call last): File " ", line 1, in s[2] TypeError: 'set' object is not subscriptable
- 创建集合
-
- 直接把一堆元素用花括号{}括起来
-
>>> s={1,2,3,4,5} >>> type(s)
-
- 使用set()工厂函数
- set(列表|元组|字符串),其中元组需要用( )
- 使用set()创建的集合是无序的
-
>>> set1=set([11,2,3,3,5,6]) >>> set1 {2, 3, 5, 6, 11} >>> set2=set(1,1,2,3,3,5) Traceback (most recent call last): File "
", line 1, in set2=set(1,1,2,3,3,5) TypeError: set expected at most 1 argument, got 6 >>> set2=set((1,1,2,3,3,5)) >>> set2 {1, 2, 3, 5} >>> set3=set('123455677') >>> set3 {'7', '6', '4', '2', '3', '1', '5'}
- 访问集合
- 利用for循环读取集合中的数据
-
>>> set1=set([1,2,3,4,5]) >>> for each in set1: print(each) 1 2 3 4 5
- 通过in和not in判断是否在集合中
-
>>> set1 {1, 2, 3, 4, 5} >>> 1 in set1 True >>> 0 in set1 False
- 不可变集合
-
- 不可变集合中的数据有一定稳定性,不可随意修改
- 可用frozenset() 定义不可变集合
-
>>> s=frozenset([1,2,3,4,5,5]) >>> s frozenset({1, 2, 3, 4, 5}) >>> s.add(6) Traceback (most recent call last): File "
", line 1, in s.add(6) AttributeError: 'frozenset' object has no attribute 'add'
习题:
1、尝试一下将数据('F':70,'C':67,'h':104,'i':105,'s':115)创建为一个字典并访问键‘C’对应的值。
-
>>> 第一种方法 >>> MyDict_1 = dict((('F',70),('C',67),('h',104),('i',105),('s',115))) >>> MyDict_1['C'] 67 >>> 第二种方法 >>> MyDict_2 = {'F':70,'C':67,'h':104,'i':105,'s':115} >>> MyDict_2['C'] 67 >>> 第三种方法 >>> MyDict_3 = dict(F = 70, C = 67, h = 104, i = 105, s = 115) >>> MyDict_3['C'] 67 >>> 第四种方法 >>> MyDict_4 = dict([('F',70),('C',67),('h',104),('i',105),('s',115)]) >>> MyDict_4['C'] 67 >>> 第五种方法 >>> MyDict_5 = dict({'F':70,'C':67,'h':104,'i':105,'s':115}) >>> MyDict_5['C'] 67 >>> 第六种方法 >>> MyDict_6 = dict(zip(['F', 'C', 'h', 'i', 's'], [70, 67, 104, 105, 115])) >>> MyDict_6['C'] 67
2、编写通讯录
-
def Menu(): print('|--- 欢迎进入通讯录程序 ---|') print('|--- 1:查询联系人资料 ---|') print('|--- 2:插入新的联系人 ---|') print('|--- 3:删除已有的联系人 ---|') print('|--- 4:查看所有通讯录 ---|') print('|--- 5:退出通讯录程序 ---|') def Search(): name=input("请输入要查询联系人姓名:") if name in P.keys(): print(P[name]) else: print("查询失败,联系人不存在!") return def Sert(): name=input("请输入联系人姓名:") tel=input("请输入联系人电话:") P.setdefault(name,tel) print("添加成功!") return def Clear(): t=input("确认清空请输入1,否则输入0:") if t==1: P.clear() else: return def Show(): for i in P.items(): print(i) return P={'yyl':1111,'xr':222,'ll':333} Menu() while True: n=int(input("请选择操作(1、2、3、4、5):")) if n==1: Search() elif n==2: Sert() elif n==3: Clear() elif n==4: Show() else: break print("已退出通讯录!")
3、编写登录程序
-
def create(): name=input("请输入用户名:") if name in user.keys(): print("该用户已存在!") return else: pswd=int(input("请输入密码:")) user.setdefault(name,pswd) print("成功添加用户!") return def logn(): name=input("请输入用户名:") if name not in user.keys(): print("用户名不存在!") return else: pswd=int(input("请输入密码:")) if pswd==user[name]: print("登录成功!") return else: print("密码错误!") return def ex(): print("感谢使用,已退出登录!") user={'yyl':111,'xr':222} while True: x=input('''|--- 新建用户:N/n ---| |--- 登录帐号:E/e ---| |--- 退出程序:Q/q ---| |--- 请输入指令代码:''') if x.lower() =='n': create() elif x.lower()=='e': logn() elif x.lower()=='q': ex() break else: print("输入有误,请重新输入!")
总结:
-
访问字典的方法:
1)dict1.keys() 返回键
2) dict1.value() 返回值
3)dict1.items() 返回键值对(也就是项)
4)dict1.get() 对应键的值不存在的话返回一个None,这样程序就不会报错
5)key in dict1 查找的是键,而不是值
6)dict1.clear() 清空字典,不建议使用直接赋空值的方法:dict1 = {}
7)dict1.copy():浅拷贝(见练习题5)
8)dict1.pop():给定键弹出相应值
9)dict1.popitem():给定键弹出相应项(包括键和值)
10)dict1.setdefault():找不到给定键对应的值话会自动在字典中创建一个基于该键的项(区别于dict1.get()的结果)
11)dict1.update():根据一个字典或映射关系去更新另一个字典