"""
字典和集合:
字典是一系列由键(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).