Python学习笔记2:字典
概述
除了列表,Python中最常用的内建容器就是字典了,这是一种无序的键值对形式的对象集合。
这其中包含三层含义:
-
无序,即你不应该对字典数据的访问顺序抱有期待,其真是的访问顺序完全由Python解释器决定。
-
键值对,这在其它编程语言中也叫做关系数组或者散列,其运用在实际开发中相当普遍,像
json
或者XML
格式的数据都通常会用这种数据结构来处理。 -
对象集合,这意味着和列表一样,可以包含任何形式的数据。
需要注意的是字典中的键是具有唯一性的。当然,如果值一般,字典的键也是对象,其是否唯一的判断逻辑取决于对象对
==
运算符的重载处理,这在后续深入理解部分会提到。
创建
在代码中创建字典很简单,如果你熟悉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
中指定key
和val
。
排序
如前面所说,字典是个无序容器,所以不能对它的访问顺序有所期待,但有时候我们又需要顺序访问,怎么做?
对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的开发环境,折腾了好长时间,就分开发吧。