在python中字典是一系列的键-值对,它也是python中唯一的映射类型。每个键都与一个值相对应,你可以使用键来访问与之相关联的值。与键相关联的值可以是任何python对象。
定义字典
在python中用放在花括号{}中的一系列键值对来表示,其中键-值是两个相关联的值。指定键是,python将返回与之相关联的值。键和值之间用冒号来分割,而键值对之间则用逗号进行分割。
如下示例:
# python dictionary
st_info = {"name":"zhaosi","age":"18"};
st_info2 = {'name':'zhaosi','age':'18'};
其中键名的定义可以使用单引号也可以使用双引号,不过个人推荐使用单引号,如果我们打印一下这两个字典可以发现其输出是一样的,且都使用了单引号来输出结果。
{'name': 'zhaosi', 'age': '18'}
{'name': 'zhaosi', 'age': '18'}
访问字典
有了字典,我们自然要学会如何去访问其中存储的值了。在python中访问字典中的值是十分简单的,只要通过键名来访问即可。
# python dictionary
st_info = {'name':'zhaosi','age':18};
print("student name is:" + st_info['name']);
输出:
student name is:zhaosi
这里使用键名来访问字典,其语法就是方括号[]里面是键名.
接下来我们试着输出一下年龄,大家也看到了,名字和年龄一个是字符串一个是数字。
print("student age is:" + st_info['age']);
好了,直接访问年龄然后输出年龄信息。我们试着运行程序结果却产生了错误:
Traceback (most recent call last):
File "D:/Programs/python/HelloWorld/hello_world.py", line 3, in <module>
print("student age is:" + st_info['age']);
TypeError: must be str, not int
大家可以看到st_info[‘age’]返回的是值得类型,所以有一点请大家注意一下:使用上述访问字典的方式,其返回的值得类型是不一致的,请按照使用情况进行特殊处理。
在这里显然我们将其转化为字符串就ok了。
str(st_info['age'])
还记得吧?
动态添加键值对
字典是一种动态结构,我们可以随时为字典添加新的键值对。
还是上面的例子,我们为该学生信息添加学校和班级的信息。
# python dictionary
st_info = {'name':'zhaosi','age':18};
print(st_info);
# add school info
st_info['school'] = "第一中学";
# add class info
st_info['class'] = 8;
print(st_info);
我们首先定义了一个字典,然后打印字典内容。
{'name': 'zhaosi', 'age': 18}
输出原有字典内容后,我们为字典添加班级信息,然后打印新的字典:
{'name': 'zhaosi', 'age': 18, 'school': '第一中学', 'class': 8}
创建空字典
在很多情况下,我们需要定义一个空的字典,那么在python中怎么定义一个空字典?
在上面我们学习了字典的定义,那么如何定义空字典,想必大家心里有数吧?
很简单,在上面的例子中,我们不要键值对就好了,一句话就一个花括号{}.
empty_dic = {};
修改字典中的值
上面我们看到过如何通过键名来访问字典,修改字典中的值和访问是一样的,同样通过键名获取值,然后重新赋值即可。
st_info = {'name':"zhaosi",'age':18};
# update age
st_info['age'] = 25;
print(st_info);
在代码的最后我们打印一下修改后的字典:
{'name': 'zhaosi', 'age': 25}
删除键值对
增删改查,这对任何数据结构都是必须了解的,那么python中字典该怎么删除我们不需要的键值对呢?
这个可以稍微有点特殊,因为我们需要借用del语句来进行删除,格式是:
del 字典名[键名]
值得注意的是,通过del删除的内容是永久性的删除,不要想着还能找回来哦。
st_info = {'name':"zhaosi",'age':18};
del st_info['age'];
print(st_info);
输出:
{'name': 'zhaosi'}
遍历键值对
提起遍历,首先我们想到的就是循环语句,没错,这里还是使用for循环来遍历字典。
# programming hobbies
favorite_languages = {
'jen':'java',
'john':'c',
'sarah':'c#',
}
for key,value in favorite_languages.items():
print(key.title() + "`s"
+ "favorite language is:"
+ value);
在这个例子里面我们定义了一个程序语言爱好的字典,然后遍历字典,输出每个人爱好的编程语言。
Jen`sfavorite language is:java
John`sfavorite language is:c
Sarah`sfavorite language is:c#
我们注意一下for循环的语法,其中首先要注意的是favorite_languages.items()语句,其中item方法返回的是键值对信息,
Inferred type: (self: dict) -> ItemsView[_KT, _VT]
D.items() -> a set-like object providing a view on D's items
如果一不小心我们没有调用这个方法,而是如下使用:
for key,value in favorite_languages:
那么python会毫不客气的告诉你,出错了。
Traceback (most recent call last):
File "D:/Programs/python/HelloWorld/hello_world.py", line 8, in <module>
for key,value in favorite_languages:
ValueError: too many values to unpack (expected 2)
这点希望大家可以留意。另外for语句中申明的两个变量key,value分别代表什么,想必大家都清楚。
遍历键值
有些时候,我们只关心字典中的键名,比如上面的例子,我们只想知道到底有哪些人在我们的字典中,那么这个时候我们就可以使用keys()方法来获取所有的键值:
for key in favorite_languages.keys():
print(key.title() + " is in our dictionary");
当然了,我们还有另外一种格式:
for key in favorite_languages:
print("# " + key.title() + " is in our dictionary");
python在遍历字典的时候,默认后遍历所有的键,所以上面两种方式的结果是相同的,不过如果能显示调用keys()能够让我们的代码更加的清楚明了,这点看个人喜好了。
Jen is in our dictionary
John is in our dictionary
Sarah is in our dictionary
# Jen is in our dictionary
# John is in our dictionary
# Sarah is in our dictionary
这里在额外补充一点,那就是对字典进行排序,就拿上面的例子来说,我们希望能够按照名字字母的顺序输出结果,此时我们就得对所有的键进行排序然后顺序输出
# programming hobbies
favorite_languages = {
'gen':'java',
'tim':'c',
'sarah':'c#',
}
for key in sorted(favorite_languages.keys()):
print(key.title() + " is in our dictionary");
为了能够让程序有一个清楚的变化,我修改了上面的键名,以便排序的效果更为直观:
还记得如果我们不进行排序的话:
Gen is in our dictionary
Tim is in our dictionary
Sarah is in our dictionary
这应该就是我们的理想输出,那么接下来我们看下排序后的结果:
Gen is in our dictionary
Sarah is in our dictionary
Tim is in our dictionary
这里就不介绍sorted()函数了,以前我们提到过。
遍历所有的值
既然有遍历所有键名的方法,那么就一定会有遍历所有值的方法。
还记得我们遍历键的时候使用的是keys()方法吧,那么我们遍历值得时候应该使用的就是values()方法吧。让我们看下我们的猜测是不是对的。
for value in favorite_languages.values():
print(value.title());
这里我们是输出所有的值,其中我们并没有考虑其中的值是否有重复的。那么输出应该如下:
Java
C
C#
这里我们的字典元素很少,也没有重复的,大家想一下,如果我们有百万条的数据,其中编程语言重复的应该有很多,那么这时候输出的结果必然有大量的无用数据,那么在python中,我们怎么去除这些重复的数据呢?
答案是:使用set(),set可以查找出列表独一无二的元素,然后返回一个新的集合。
# programming hobbies
favorite_languages = {
'gen':'java',
'tim':'c',
'sarah':'c#',
'sarah2': 'c#',
'sarah3': 'c#',
}
for value in set(favorite_languages.values()):
print(value.title());
上面我们添加几条值相同的数据,然后看下输出结果:
C
C#
Java
嵌套
这个概念不应该单独提出来,因为我们在前面说过,字典的值可以是任意类型的,那么自然可以是列表,甚至字典本身。
字典列表
这个很简单,就是列表里面存的是我们今天学习的字典。
student1 = {'name':'wangsan','age':15};
student2 = {'name':'lisi','age':15};
student3 = {'name':'zhaoliu','age':15};
students = [student1,student2,student3];
print(students);
字典中使用列表和字典
话不多说,直接来个例子:
student1 = {'name':'wangsan','age':15};
student2 = {'name':'lisi','age':15};
student3 = {'name':'zhaoliu','age':15};
students = [student1,student2,student3];
all_student = {
'class':'第一中学',
'students':students,
}
print(all_student);
想必看到这里,大家应该知道怎么使用这些东西来组成更加复杂的数据了吧。