zoukankan      html  css  js  c++  java
  • python学习(四) 字典:当索引不好用时

                      第四章 字典:当索引不好用时

    4.1 字典的使用

    字典的适用场景:

    表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组;

    存储文件修改时间,用文件名作为键;

    数字电话/地址簿

    4.2 创建和使用字典

    如下的“键-值”对就是字典

    >>> phonebook = {'alice':'2341', 'beth':'9876'}
    >>> phonebook['alice']
    '2341'

    4.2.1 dict函数

    可以用dict函数,通过其他映射或键-值对的序列建立字典。

    >>> items = [('name','gumby'),('age',42)]
    >>> d = dict(items)
    >>> d['name']
    'gumby'
    >>> d
    {'name': 'gumby', 'age': 42}

    也可以通过关键字参数来创建字典:

    >>> d = dict(name='gumby', age = 42)
    >>> d
    {'name': 'gumby', 'age': 42}

    4.2.2 基本字典操作

    >>> len(d)           // 字典长度
    2
    >>> d["name"]     // 取得键对应的值
    'gumby'
    >>> d["name"] = "aaaa"  // 赋值
    >>> d
    {'name': 'aaaa', 'age': 42}
    >>> del d["name"]         // 删除
    >>> d
    {'age': 42}
    >>> "name" in d           // 检查键是否在字典中
    False

    键类型:字典的键不一定为整型数据,可以是任意的不可变类型,比如浮点数,字符串或者元组。

    自动添加:即使键起初不在字典中,也可以为他赋值,这样字典就会建立新项。

    >>> x = []                              //  不合法,因为这是一个列表
    >>> x[42] = 5
    Traceback (most recent call last):
    File "<pyshell#147>", line 1, in <module>
    x[42] = 5
    IndexError: list assignment index out of range

    >>> x = {}                               // 合法,这是一个映射
    >>> x[42] = "fsd"
    >>> x
    {42: 'fsd'}

    注意:   ( )  -   元组

                  [ ]   -   序列

             { }   -  字典

    4.2.3 字典的格式化字符串

    >>> var = {"beth":'9102', "cecil":'3258'}
    >>> "%(cecil)s" % var            // 可以用键
    '3258'

    4.2.4 字典的方法

     1)clear

    清楚字典的所有项,原地操作,无返回值

    >>> var
    {'beth': '9102', 'cecil': '3258'}
    >>> var.clear()
    >>> var
    {}            // 空字典

     2)copy  返回相同键-值对的新字典(这个方法是浅复制)

    >>> x = {'username':'admin','machines':['foo','bar','baz']}
    >>> x
    {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
    >>> y = x.copy()
    >>> y['username'] ='newname'              // 替换某个值,原始字典不受影响
    >>> y['machines'].remove('bar')            // 如果修改了某个值(原地修改,而不是替换),原始字典也会改变,
    >>> y
    {'username': 'newname', 'machines': ['foo', 'baz']}   
    >>> x
    {'username': 'admin', 'machines': ['foo', 'baz']}

    避免上述浅复制问题的方案是,使用深复制deepcopy

     3)fromkeys:用给定的键建立新字典,每个键对应的值是NONE

    >>> {}.fromkeys(['name','age'])
    {'name': None, 'age': None}

    >>> dict.fromkeys(['name','age'],'(unknown)')         
    {'name': '(unknown)', 'age': '(unknown)'}

     4)get

    >>> d = {}
    >>> d["anem"]             // 这种方式访问不存在的键会抛出异常
    Traceback (most recent call last):
    File "<pyshell#10>", line 1, in <module>
    d["anem"]
    KeyError: 'anem'
    >>> d.get("fsd")         // get不会抛出异常,当访问不存在的键的时候
    >>>

     5) has_key : python 3不支持

     6) items 和iteritems

     7) keys和iterkeys

     8)pop:  得到给定的键的值,并删除

    >>> d
    {'anme': 'fds'}
    >>> d.pop('anme')
    'fds'
    >>> d
    {}

     9) popitem:弹出随机的项(用于一个一个移除并处理

    10) setdefault: 如果键存在,返回对应的值;如果不存在,则返默认值并更新。

    >>> d
    {}
    >>> d.setdefault('name',"jj")
    'jj'
    >>> d
    {'name': 'jj'}

    11) update:  利用一个字典项更新另外一个字典。 提供的项会被添加到旧的字典中,如果键存在,就覆盖。

  • 相关阅读:
    【算法导论】第11章,散列表
    【算法导论】第10章,基本数据结构
    【推荐系统实践】冷启动问题
    【算法导论】第8、9章,线性时间排序,中位数顺序统计量
    【推荐系统实践】协同过滤
    Java编程思想---第五章 初始化与清理(下)
    Java编程思想---第五章 初始化与清理(上)
    Java编程思想---第四章 控制执行流程
    Java编程思想---第三章 操作符
    去除MyEclipse频繁弹出的Update Progress窗口
  • 原文地址:https://www.cnblogs.com/liufei1983/p/7217619.html
Copyright © 2011-2022 走看看