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 . "\r\n";
}

输出

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的开发环境,折腾了好长时间,就分开发吧。

上一篇:JavaScript中的类


下一篇:redis集群配置