字典和集合+3.31 每日一练

"""
字典和集合:
字典是一系列由键(key)和值(value)配对组成的元素的集合,在 Python3.7+,字典被确定为有序,而 3.6 之前是无序的,其长度大
小可变,元素可以任意地删减和改变。相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。

集合和字典基本相同,唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。
字典和集合的创建,通常有下面这几种方式:
#字典:
d1 = {'name':'lijinyu','age':22,'number': 17852365595}   'name','age','number'就是键(key)
d2 = dict({'name':'lijinyu','age':22,'number': 17852365595})
d3 = dict([('name','lijinyu'),('age',22),('number',17852365595)])
d4 = dict(name='lijinyu',age=22,number=17852365595)
d1 == d2 == d3 == d4
#集合:
s1 = {1,2,3}
s2 = set([1,2,3])
s1 == s2
python中字典和合集,无论是键还是值,都可以是混合类型

关于字典的元素访问:
字典访问可以直接索引键,如果不存在,就会抛出异常:
d1 = {'name':'lijinyu','age':22,'number': 17852365595}
print(d1['name'])   #--输出lijinyu
print(d1['hobby'])  #--Traceback (most recent call last):   KeyError: 'hobby' 报错
#这个时候就可以用get(key,default)函数来进行索引(如果键不存在,调用get()函数可以返回一个默认值)
d1 = {'name':'lijinyu','age':22,'number': 17852365595}
print(d1.get('name'))
print(d1.get('hobby','null')) #--返回null(默认值可以随意更改)
关于集合的元素访问:
*集合并不支持索引操作,因为集合本质是一个哈希表,和列表不一样,所以以下的操作是错误的
s = {1,2,3}
print(s[0]) #--Traceback (most recent call last):  TypeError: 'set' object does not support indexing
#所以想要判断一个元素在不在字典或者合集内,我们可以用 value in dict/set来判断:
#字典:
d1 = {'name':'lijinyu','age':22,'number': 17852365595}
print('name' in d1)    #--TRUE
print('hobby' in d1)   #--False
#集合
s = {1,2,5}
print(1 in s)  #--True 1这个数字在不在1,2,5之内
print(3 in s)  #--False

除了创建和访问,字典和集合也支持增、删、改等操作
#字典:
d1 = {'name':'lijinyu','age':22,'number': 17852365595}
d1['hobby'] = 'ts'  #--增加元素'hobby'='ts'
d1['birthday'] = '10-17'  #--增加元素'birthday'='10-17'   增加元素后字典的顺序是按照abcdefg....
print(d1)
d1['age'] = 21  #直接修改'age'对应的值
d1.pop('number')#删除'number'的值
print(d1)
#*注意:集合的pop()操作是删除集合中的最后一个元素,但是集合本身是无序的,无法知道会删除哪个元素,使用要谨慎。
#集合
s = {1,2,3}
s.add(5)  #--增加5到集合
print(s)
s.remove(2) #--删除集合里的2
print(s)

实际应用时,我们需要对字典和合集进行排序,比如要取出最大的50对:
字典排序:通常会根据键或值,进行升序降序
d1 = {'b':5,'a':2,'c':1}
d1_sorted_by_key = sorted(d1.items(),key=lambda x: x[0])  #--根据字典键的升序排序
print(d1_sorted_by_key)  #--[('a', 2), ('b', 5), ('c', 1)]
d1_sorted_by_value = sorted(d1.items(),key=lambda x: x[1]) #--根据字典值的升序排序
print(d1_sorted_by_value)#--[('c', 1), ('a', 2), ('b', 5)]
#返回的是列表,列表中的每个元素,是由原字典的键和值组成的元组
集合排序:类似元组、列表,直接调用sorted(set)即可
s = {1,6,2,70}
print(sorted(s))  #--对集合元素升序排序

字典和集合的性能:
集合使用更高效快速

字典和集合的工作原理:
字典和集合为什么能如此高效,特别是增、删、查操作时?
不同于其他数据结构,字典和集合的内部结构都是一张哈希表
字典:这张表存储了哈希值、键、值,三个元素
集合:哈希表内没有键和值的配对,只有单一的元素
"""
以下不能创建一个字典的语句是
A.  dic1 = {}
B.  dic2 = {3:5}
C.  dic3 = {[1,2,3]:"usetc"}
D.  dic4 = {(1,2,3):"usetc"}
C不可以,应为c的创建字典语句是列表类型的

list和tuple有什么不同?
简单概括区别:List有(先后)次序,Tuple有(逻辑)结构 
1>list是可变的,tuple不可变(tuple没有insert, pop,append方法);
2>定义只有一个元素的tuple的时候,必须加逗号,否则不会被认为是tuple,而被识别为括号(比如,a = (1) 会被识别为数字1,a =  (1,)这样才被识别为一个元组,只有一个元素,数字1);
3>元组可以转列表,但不可以转字典(tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple).
posted @ 2020-03-31 21:44  扎小辫的胖虎  阅读(135)  评论(0编辑  收藏  举报