zoukankan      html  css  js  c++  java
  • 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代表作': '《蜀道难》、《将进酒》'}
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/sinlearn/p/12665393.html
Copyright © 2011-2022 走看看