• python 数据结构--Dictionary(字典)


    Dictionary(字典)

    一种通过名字引用值的数据结构,这种结构类型称为映射(mapping)。字典是Python中唯一内建的映射类型,字典指定值并没有特殊顺序,都存储在一个特殊的键(Key)里,键可以是数字、字符串或元组。字典是另一种可变容器模型,可存储任意类型的对象。

    1.1 认识字典的作用

    students = ['小明','小红','小张','王军']
    numbers = ['1001','1002','1003','1004']
    
    # 假设需要查找小张的学号则需:
    print('小张的学号:',numbers[students.index('小张')])
    
    小张的学号: 1003
    
    students = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    print('小张的学号:',students['小张']) # 通过键访问字典对应的值
    
    小张的学号: 1003
    

    1.2 创建和使用字典

    字典的创建格式如下:
    dict_one = {
    key1: value1,
    key2: value2
    }

    1.2.1 dict()函数

    student = [('name','小明'),('number','1001')]
    detail = dict(student)
    print('学生详细信息:', detail)
    
    学生详细信息: {'name': '小明', 'number': '1001'}
    

    1.2.2 修改字典

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    stu['王军']
    
    '1004'
    
    stu['王军'] = '1005'
    stu['王军']
    
    '1005'
    

    1.2.3 删除字典

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    print(stu)
    
    {'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004'}
    
    del stu['王军']
    print(stu)
    
    {'小明': '1001', '小红': '1002', '小张': '1003'}
    
    # 删除字典 del stu
    

    1.2.4 字典的特性

    字典值可以没有限制地取任何Python对象,既可以是标准对象,也可以是用户定义的对象,但键不行。需要记住以下两点:

    (1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后面的值会被记住;

    (2)键必须不可变,可以用数字、字符串或元组充当,不能用列表。

    1.2.5 len()函数

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    len(stu) # 统计字典中键的总数
    
    4
    
    type(stu)
    
    dict
    

    1.2.6 字典的格式化字符串

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    print('小明的学号是:%(小明)s'  %stu)
    
    小明的学号是:1001
    

    1.2.7 字典和列表的区别

    dict的特点是:
    (1)查找和插入的速度极快,不会随着key的增加而变慢。
    (2)需要占用大量内存,内存浪费多。
    list的特点是:
    (1)查找和插入时间随着元素的增加而增加。
    (2)占用空间小,浪费内存很少。所以,dict是使用空间换取时间。

    提 示:dict内部存放的顺序和键放入的顺序没有关系。

    1.3 字典方法

    1.3.1 clear()方法

    clear()方法用于删除字典内的所有项。clear()方法的语法如下:dict.clear()此语法中,dict代表指定字典,该方法不需要参数。该函数是一个原地操作(类似于list.sort)函数,没有任何返回值(返回值为None)。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' 
    }
    stu.clear()
    print("字典中的元素个数为:%d " % len(stu))
    
    字典中的元素个数为:0 
    
    x = {'age': 10}
    y = x
    x = {} #重新关联到另外一个字典,这对y没有影响
    y
    
    {'age': 10}
    
    x = {'age': 10}
    y = x
    x.clear() #使用clear后,y的值也被清空
    y
    
    {}
    

    1.3.2 copy()方法

    copy()方法返回一个具有相同键/值对的新字典。这个方法是浅复制(shallow copy),因为值本身是相同的,而不是副本。copy()方法的语法如下:dict.copy()此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的浅复制。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
        'info': ['小张','1006','man']
    }
    st = stu.copy()
    print("赋值后得到的st为",st)
    
    赋值后得到的st为 {'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006', 'man']}
    
    st['王军'] = 1005  # 替换副本的值,原始字典不受影响
    print(st)
    print(stu)
    
    {'小明': '1001', '小红': '1002', '小张': '1003', '王军': 1005, 'info': ['小张', '1006', 'man']}
    {'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006', 'man']}
    
    st['info'].remove('man')  # 修改了某个值,不是替换,原始字典也会受到影响
    print(st)
    print(stu)
    
    {'小明': '1001', '小红': '1002', '小张': '1003', '王军': 1005, 'info': ['小张', '1006']}
    {'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006']}
    

    1.3.3 fromkeys()方法

    fromkeys()方法用于创建一个新字典。fromkeys()方法的语法如下:dict.fromkeys(seq[, value]))此语法中,dict代表指定字典;seq代表字典键值列表;value代表可选参数,设置键序列(seq)的值。该方法返回结果为列表。

    seq = ['name','age','sex','tel']  # 键值序列
    info = dict.fromkeys(seq)
    info
    
    {'age': None, 'name': None, 'sex': None, 'tel': None}
    

    1.3.4 get()方法

    get()方法返回指定键的值,如果值不在字典中,就返回默认值。get()方法的语法如下:dict.get(key, default=None)此语法中,dict代表指定字典,key代表字典中要查找的键,default代表指定键的值不存在时返回默认值。该方法返回结果为指定键的值,如果值不在字典中,就返回默认值None。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
        'info': ['小张','1006','man']
    }
    stu.get('小明')
    
    '1001'
    

    1.3.5 key in dict方法

    Python字典in操作符用于判断键是否存在于字典中,如果键在字典dict中就返回true,否则返回false。该方法的语法如下:key in dict此语法中,dict代表指定字典,key代表要在字典中查找的键。如果键在字典里就返回true,否则返回false。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
        'info': ['小张','1006','man']
    }
    # 'info' in stu True
    '小强' in stu
    
    False
    

    1.3.6 items()方法

    items()方法以列表返回可遍历的(键/值)元组数组。items()方法的语法如下:dict.items()此语法中,dict代表指定字典,该方法不需要参数。返回结果为可遍历的(键/值)元组数组。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
    }
    for i in stu.items():
        print(i)
    
    ('小明', '1001')
    ('小红', '1002')
    ('小张', '1003')
    ('王军', '1004')
    

    1.3.7 keys()方法

    keys()方法以列表返回一个字典的所有键。keys()方法的语法如下:dict.keys()此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的所有键。该方法使用示例如下:

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
    }
    for k in stu.keys():
        print(k)
    
    小明
    小红
    小张
    王军
    

    1.3.8 setdefault()方法

    setdefault()方法和get()方法类似,用于获得与给定键相关联的值。如果键不存在于字典中,就会添加键并将值设为默认值。setdefault()方法的语法如下:dict.setdefault(key, default=None)此语法中,dict代表指定字典,key代表查找的键值,default代表键不存在时设置的默认键值。该方法没有任何返回值。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '王军': '1004' ,
    }
    print(stu.setdefault('小强'))
    print(stu.setdefault('小明'))
    
    None
    1001
    

    1.3.9 update()方法

    update()方法用于把字典dict2的键/值对更新到dict里。update()方法的语法如下:dict.update(dict2)此语法中,dict代表指定字典,dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。

    stu = {
        '小明':  '1001',
        '小红': '1002',
        '小张': '1003',
        '小文': '1004' ,
    }
    stu1 = {
        '小李':  '1005',
        '小王': '1006',
        '小蓝': '1007',
        '小熊': '1008' ,
    }
    stu.update(stu1)
    stu
    
    {'小张': '1003',
     '小文': '1004',
     '小明': '1001',
     '小李': '1005',
     '小熊': '1008',
     '小王': '1006',
     '小红': '1002',
     '小蓝': '1007'}
    

    1.3.10 values()方法

    values()方法以列表形式返回字典中的所有值。与返回键的列表不同,返回的列表中可以包含重复的元素。values()方法的语法如下:dict.values()此语法中,dict代表指定字典,该方法不需要参数。返回结果为字典中的所有值。

    for v in stu.values():
        print(v)
    
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    

    1.4 字典合并与排序

    有两个字典,先将字典合并,完成后对合并的字典进行排序。大体思路:

    • (1)借助字典的update函数将字典合并。
    • (2)准备一个将字典转化为列表的函数(知识点:字典转化为列表)。
    • (3)将转化后的列表进行排序(知识点:列表排序)。
    • (4)将排序好的列表转化为字典(知识点:列表转化为字典)。
    def dictTolist(dic:dict):
        """将字典转化为列表"""
        keys = dic.keys()
        values = dic.values()
        lst = [(key,val) for key,val in zip(keys,values)]
        return lst
    def merge_sort():
        dict_one = {"2性别":"男","1姓名":"李白","5外号":"诗仙"}
        dict_two = {"4派系":"浪漫主义诗人","3朝代":"唐朝","6代表作":"《蜀道难》、《将进酒》"}
        dict_merge = dict()
        dict_merge.update(dict_one)
        dict_merge.update(dict_two)
        desc_list = sorted(dictTolist(dict_merge),key=lambda x:x[0],reverse=True)
        desc_dict = dict(desc_list)
        
        asc_list = sorted(dictTolist(dict_merge),key=lambda x:x[0],reverse=False)
        asc_dict = dict(asc_list)
        print(f'合并的结果为:{dict_merge}')
        print(f'按照第0个元素降序排列:{desc_dict}')
        print(f'按照第0个元素升序排列:{asc_dict}')
        print
    merge_sort()
    
    合并的结果为:{'2性别': '男', '1姓名': '李白', '5外号': '诗仙', '4派系': '浪漫主义诗人', '3朝代': '唐朝', '6代表作': '《蜀道难》、《将进酒》'}
    按照第0个元素降序排列:{'6代表作': '《蜀道难》、《将进酒》', '5外号': '诗仙', '4派系': '浪漫主义诗人', '3朝代': '唐朝', '2性别': '男', '1姓名': '李白'}
    按照第0个元素升序排列:{'1姓名': '李白', '2性别': '男', '3朝代': '唐朝', '4派系': '浪漫主义诗人', '5外号': '诗仙', '6代表作': '《蜀道难》、《将进酒》'}
  • 相关阅读:
    ZOJ1542 POJ1861
    Codeforces Round #194 (Div. 2) 部分题解
    SRM585 div2
    hdu 4627 The Unsolvable Problem
    hdu 4622 Reincarnation
    hdu 4617 Weapon
    hdu 4609 3-idiots
    hdu 4616 Game
    hdu 4611 Balls Rearrangement
    hdu 4618 Palindrome Sub-Array
  • 原文地址:https://www.cnblogs.com/sinlearn/p/12665393.html
Copyright © 2020-2023  润新知