• Python3学习之路~2.4 字典操作


    字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

    定义字典(dictionary)

    info = {
        'stu1101': "Amy",
        'stu1102': "Bob",
        'stu1103': "Cindy"
    }

    字典的特性:

    • dict是无序的
    • key必须是唯一的,so 天生去重
    • 查询速度快,比列表快多了
    • 比list占用内存多

    为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?

    哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法

    dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。

    增加

    >>> info["stu1104"]="David" #增加
    >>> info
    {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
    View Code

    删除

    >>> info
    {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
    >>> info.pop("stu1101") #标准删除
    'Amy'
    >>> info
    {'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
    >>> del info["stu1103"] #换个姿势删除,del是Python自带的,想删谁就删谁
    >>> info
    {'stu1102': 'Bob', 'stu1104': 'David'}
    >>> info.popitem() #随机删除
    ('stu1104', 'David')
    >>> info
    {'stu1102': 'Bob'}
    View Code

    查找

    >>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
    >>> "stu1102" in info #标准用法,判断一个key是否在字典中存在
    True
    >>> info.get("stu1102") #获取
    'Bob'
    >>> info["stu1102"] #同上,但是看下面
    'Bob'
    >>> info.get("stu1105") #key不存在返回None
    >>> print(info.get("stu1105"))
    None
    >>> info["stu1105"] #key不存在就报错,慎用
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'stu1105'
    View Code

    修改

    >>> info
    {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy'}
    >>> info["stu1101"]="Alex" #修改
    >>> info
    {'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy'}
    View Code

    其他

    >>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
    >>> info.values() #输出字典中所有的value
    dict_values(['Amy', 'Bob', 'Cindy'])
    >>> info.keys() #输出字典中所有的key
    dict_keys(['stu1101', 'stu1102', 'stu1103'])
    >>> info.setdefault("stu1106","xiaoming") #查找字典中是否有stu1106,若没有则创建并为其赋值为xiaoming
    'xiaoming'
    >>> info
    {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
    >>> info.setdefault("stu1101","Alex") #查找字典中是否有stu1101,若有,返回其值,且不修改
    'Amy'
    >>> info
    {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
    >>> b={1:2,3:4,'stu1101':'Alex'}
    >>> info.update(b) #两个字典表合并,若key有交叉则覆盖其值
    >>> info
    {'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming',1: 2, 3: 4}
    >>> info.items() #字典转成列表
    dict_items([('stu1101', 'Alex'), ('stu1102', 'Bob'), ('stu1103', 'Cindy'), ('stu1106', 'xiaoming'), (1, 2), (3, 4)])
    >>> dict.fromkeys([1,2,3],'test') #通过一个列表生成默认dict,最好少用,因为有个不好解释的坑,如下
    {1: 'test', 2: 'test', 3: 'test'}
    >>>
    >>> c=dict.fromkeys([1,2,3],'test')
    >>> c
    {1: 'test', 2: 'test', 3: 'test'}
    >>> c[1]="aaa" #无嵌套时,只修改1对应的value
    >>> c
    {1: 'aaa', 2: 'test', 3: 'test'}
    >>> c=dict.fromkeys([6,7,8],["aa",{"name":"Alex"},"bb"])
    >>> c
    {6: ['aa', {'name': 'Alex'}, 'bb'], 7: ['aa', {'name': 'Alex'}, 'bb'], 8: ['aa', {'name': 'Alex'}, 'bb']}
    >>> c[7][1]["name"]="jack" #多层嵌套时,所有的key对应的value都修改,类似于列表的copy方法
    >>> c
    {6: ['aa', {'name': 'jack'}, 'bb'], 7: ['aa', {'name': 'jack'}, 'bb'], 8: ['aa', {'name': 'jack'}, 'bb']}
    View Code

    循环dict

    >>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
    >>> for key in info:
    ...     print(key,info[key]) #方法1,高效,建议使用
    ...
    stu1101 Amy
    stu1102 Bob
    stu1103 Cindy
    >>> for k,v in info.items():
    ...     print(k,v)    #方法2,会先把dict转成list,数据里大时莫用
    ...
    stu1101 Amy
    stu1102 Bob
    stu1103 Cindy
    >>>
    View Code

     多级字典嵌套及操作

    ...

  • 相关阅读:
    硬盘安装RedHat,FC和CentOS5.7
    Stanford CoreNLP开源项目的3种编译和运行方式
    Heritrix源码分析(六) Heritrix的文件结构分析
    java里抽象类和接口的区别
    centos 5 手动分区来安装系统的方法
    最大熵工具包的使用
    Heritrix源码分析(五) 如何让Heritrix在Ecplise等IDE下编程启动
    linux配置java环境变量(详细)
    CentOS安装中文支持(linux中文文件名乱码)
    安排会议,使得每个员工能够参加至少两次会议,并使会议总次数最少
  • 原文地址:https://www.cnblogs.com/zhengna/p/9182150.html
Copyright © 2020-2023  润新知