zoukankan      html  css  js  c++  java
  • Python学习笔记2:字典

    Python学习笔记2:字典

    概述

    除了列表,Python中最常用的内建容器就是字典了,这是一种无序的键值对形式的对象集合。

    这其中包含三层含义:

    1. 无序,即你不应该对字典数据的访问顺序抱有期待,其真是的访问顺序完全由Python解释器决定。

    2. 键值对,这在其它编程语言中也叫做关系数组或者散列,其运用在实际开发中相当普遍,像json或者XML格式的数据都通常会用这种数据结构来处理。

    3. 对象集合,这意味着和列表一样,可以包含任何形式的数据。

      需要注意的是字典中的键是具有唯一性的。当然,如果值一般,字典的键也是对象,其是否唯一的判断逻辑取决于对象对==运算符的重载处理,这在后续深入理解部分会提到。

    创建

    在代码中创建字典很简单,如果你熟悉json数据的处理的话会颇为顺手:

    a = {"name": "jack chen", "age": 16}
    

    如果你追求可读性更强的写法,可以这样:

    a = {"name": "jack chen",
         "age": 16}
    

    增删改查

    与其它编程语言中的关系数组操作类似,Python中的字典操作同样很简单:

    追加一个元素:

    a = {"name": "jack chen",
         "age": 16}
    a["career"] = "actor"
    print(a)
    

    输出

    {'name': 'jack chen', 'age': 16, 'career': 'actor'}

    删除一个元素:

    a = {"name": "jack chen",
         "age": 16}
    a["career"] = "actor"
    del a["age"]
    print(a)
    

    输出

    {'name': 'jack chen', 'career': 'actor'}

    修改与追加写法一致,不再赘述,访问元素同理。

    遍历

    对队列,我们可以用for/in的方式进行遍历,对字典同样可以:

    a = {"name": "jack chen",
         "age": 16}
    a["career"] = "actor"
    for column in a:
        print(column)
    

    输出

    name
    age
    career

    可以看到,用for/in的形式仅仅取到了key(键),而非value(值)。当然,我们可以进一步在循环体内通过a[column]的形式获取value,但这并不方便。

    我们看下在PHP中类似的关联数组是怎么遍历的:

    <?php
    $a = array(
        "name" => "jack chen",
        "age" => 16,
        "career" => "actor"
    );
    foreach ($a as $key => $value) {
        # code...
        echo $key . ": " . $value . "
    ";
    }
    

    输出

    name: jack chen

    age: 16

    career: actor

    在Python中是不是可以这样呢?答案是肯定的,不过写法并不像PHP中那样直观:

    a = {"name": "jack chen",
         "age": 16,
         "career": "actor"}
    for key, val in a.items():
        print(key, ": ", val)
    

    输出

    name : jack chen
    age : 16
    career : actor

    如果上边展示的那样,通过调用.items()可以获得一个包括key和val的可遍历对象,然后就可以在for中指定keyval

    排序

    如前面所说,字典是个无序容器,所以不能对它的访问顺序有所期待,但有时候我们又需要顺序访问,怎么做?

    对key进行排序

    Python提供内置的排序方法sorted,可以通过它或许一个有序的字典拷贝,通过这个拷贝我们就可以进行顺序读取:

    a = {"name": "jack chen",
         "age": 16,
         "career": "actor"}
    for key, val in sorted(a.items()):
        print(key, ": ", val)
    

    输出

    age : 16
    career : actor
    name : jack chen

    需要强调的是,sorted()方法只是提供一个有序拷贝,队列本身依然是无序的。

    自定义访问顺序

    我们可以借助其它容器控制对字典进行有序访问:

    a = {"name": "jack chen",
         "age": 16,
         "career": "actor"}
    aSort = ["name", "career", "age"]
    for key in aSort:
        print(key, ": ", a[key])
    

    输出

    name : jack chen
    career : actor
    age : 16

    setdefault

    在对字典这种数据结构日常使用过程中,我们经常会遇到以下这种情形:

    a = list("Hellow World!")
    count = {}
    for char in a:
        if not char in count:
            count[char] = 0
        count[char] += 1
    print(count)
    

    输出

    {'H': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, ' ': 1, 'W': 1, 'r': 1, 'd': 1, '!': 1}

    这是一个对字符串进行词频统计的程序,其中在用字典统计词频的时候,需要对其动态初始化,即如果没有相应的key就设置并初始化为0,如果不进行这一步,直接自增统计,就会报错。

    这样做并没有问题,而Python对这种情况提供一种更方便的写法:

    a = list("Hellow World!")
    count = {}
    for char in a:
        count.setdefault(char, 0)
        count[char] += 1
    print(count)
    

    这两种写法完全等效。

    本来是要把元组和集合也放在这篇里介绍的,不过因为为了对比PHP的代码,去搭了一个PHP的开发环境,折腾了好长时间,就分开发吧。

    本篇文章首发自魔芋红茶的博客https://www.cnblogs.com/Moon-Face/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    基于Visual C++2013拆解世界五百强面试题--题9-找出所有的排列方式
    基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
    基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
    宣布在 Azure 镜像库中正式推出 Windows Server 2012 R2 并降低 Windows Azure 的实例定价
    基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序
    基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
    Paging
    Swapping
    Partitioning
    Stationary point
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14511254.html
Copyright © 2011-2022 走看看