• 字典和集合+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).
  • 相关阅读:
    面试题38:股票最大收益问题
    面试题37:字符串中的括号
    面试题36:罗马数和阿拉伯数的相互转换
    面试题35:大数(字符串)相乘
    面试题34:文本对齐
    面试题33:简化目录路径
    面试题32:字符串的通配符匹配
    并发调度的可串行性
    mysql limit查询(分页查询)探究
    通过宏定义将__declspec(dllexport)与__declspec(dllimport)的转化,实现库代码和使用代码使用同一份头文件
  • 原文地址:https://www.cnblogs.com/ljy123/p/12608796.html
Copyright © 2020-2023  润新知