字典
1.一个简单的字典
现在想存储一个人的基本信息,比如姓名,年龄等信息,应该怎样存储呢?下面是一个简单的字典,存储了一个人的相关信息。
people_0 = {"name": "dana", "age": "18"}
print (people_0["name"])
print (people_0["age"])
结果
dana
18
2.使用字典
在Python中,字典是一系列的键值对。每个键都有一个值相关联,可以使用键来访问与之相关联的值。与键关联的值可以是数字,字符串,列表乃至是字典。可将任何Python对象用作字典中的值。
在Python中,字典用花括号{}中的一系列键值对表示,
键值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,键值对之间用逗号分隔。在字典中,想要存储多少个键值都可以。
2.1访问字典中的值
要获取与键相关联的值,可依次指定字典名和放在方括号之内的键。
people_0 = {"name": "dana", "age": "18"}
print (people_0["name"])
结果
dana
这将返回字典people_0中与键"name"相关联的值。
2.2 添加键值对
字典是一种动态结构,可随时在其中添加键值对。要添加键值对,可依次指定字典名,用方括号括起来的键和相关联的值。
people_0 = {"name": "dana", "age": "18"}
people_0["gender"] = "female"
people_0["hobby"] = "music"
print (people_0)
结果
{'gender': 'female', 'age': '18', 'name': 'dana', 'hobby': 'music'}
Pyhton不关心键值对的添加顺序,只关心键和值之间的关联关系。
如果添加字典时重复添加一个key,或者在定义的时候就有一个重复的key会是什么情况
people_0 = {"name": "dana", "age": "18", "gender": "female","name":"david"}
for value in people_0.values():
print (value)
结果
female
18
aaa
Python会覆盖掉相同的键的值。所以,在字典中,键永远都不会重复。
2.3 定义一个空字典
在空字典中添加键值对有时候是为了方便,有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分别添加各个键值对。
people_0 = {}
people_0["gender"] = "female"
people_0["hobby"] = "music"
结果
{'gender': 'female', 'hobby': 'music'}
先定义一个字典,在程序运行期间动态的添加数据是很常见的事情。
2.4 修改字典中的值
要修改字典中的值,可依次指定字典名,用方括号括起的键以及该键相关联的新值。
people_0 = {"name": "dana", "age": "18"}
people_0["age"] = 20
print (people_0)
结果
{'age': 20, 'name': 'dana'}
可以看到,在修改键对应的值的时候,也可以直接修改值的类型。代码中就把字符串类型的"18",修改为了int类型的20。
2.5 删除键值对
对于字典中不再需要的信息,可使用del语句将相应的键值对彻底删除。使用del语句时,必须指定字典名和要删除的键。
people_0 = {"name": "dana", "age": "18"}
del people_0["age"]
print (people_0)
结果
{'name': 'dana'}
删除的键值对将永远的消失。
3.遍历字典
一个Python字典可能只包含几个键值对,也可能包含数百万个键值对。鉴于字典可能包含大量的数据,Python支持对字典的遍历。字典可用于以各种方式存储信息,因此有多种遍历字典的方式,可遍历字典的所有键值对,键或值。
3.1 遍历所有的键值对
people_0 = {"name": "dana", "age": "18", "gender": "female"}
for key, value in people_0.items():
print ("\nkey : " + key)
print ("value : " + value)
结果
key : gender
value : female
key : age
value : 18
key : name
value : dana
要编写用于遍历字典的for循环,可声明两个变量,用于存储键值对中的键和值。对于这两个变量,可使用任何名称。
for k, v in people_0.items():
for语句包含字典名和方法名items(),它返回一个键值对列表。接下来,for循环依次将每个键值对存储到指定的两个变量中。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
key_value_list = people_0.items()
for key, value in key_value_list:
print ("\nkey : " + key)
print ("value : " + value)
结果和上面代码一样。
值得注意的一点是,即便是遍历字典时,键值对的返回顺序也与存储的顺序不同。Python不关心键值对的存储顺序,而只跟踪键和值之间的关联关系。
3.2 遍历字典中的所有键
在不需要使用字典中的值时,调用keys()方法。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
for key in people_0.keys():
print ("\nkey : " + key)
结果
key : gender
key : age
key : name
Python提取字典people_0中的所有键,并依次将它们存储到变量key中,并进行输出。
同时,可以用获取到的键直接访问字典中的值。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
for key in people_0.keys():
if key == "name":
print (people_0[key])
结果
dana
方法keys()和items()相似,实际上它返回一个列表,其中包含字典中的所有键。
3.3 按顺序遍历字典中的所有键
字典明确的记录键和值之间的关系,但获取字典的元素时,获取顺序是不可预测的。这不是问题,因为通常想要的只是获取与键相关联的正确的值。
要以特定的顺序返回元素,办法是早for循环中对返回的键进行排序。可以使用函数sorted()来获取按特定顺序排列的键列表的副本。
函数sorted()在Python学习(二)列表简介进行过使用。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
key_list = people_0.keys()
for key in sorted(key_list):
print (key)
结果
age
gender
name
对方法people_0.keys()的结果调用了函数sorted()。这让Python列出字典中所有键,并在遍历前对这个列表进行排序。
3.4 遍历字典中的所有值
想要获取字典中的所有的值,可使用方法values(),它返回一个值列表,而不包含任何键。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
for value in people_0.values():
print (value)
结果
female
18
dana
这样就提取了字典的所有值,但是没有考虑到值是否重复。涉及到值很少时,这也许不是问题,但如果值很多,最终的列表就有可能包含大量的重复值。为了剔除重复项,可使用集合set。集合类似于列表,但每个元素都必须是独一无二的。
people_0 = {"name": "dana", "age": "18", "gender": "female", "stage_name": "dana"}
for value in set(people_0.values()):
print (value)
结果
18
female
dana
通过对包含重复元素的列表调用set(),可让Python找出列表中独一无二的元素,并使用这些元素创建一个新的集合。
4.嵌套
有时候,需要将一系列字典存储到列表中,或者将列表作为值存储到字典中,这称为嵌套。可以在列表中嵌套字典,在字典中嵌套列表甚至在字典中嵌套字典。
4.1字典列表
people_0 = {"name": "dana", "age": "18", "gender": "female"}
people_1 = {"name": "david", "age": "20", "gender": "male"}
people_2 = {"name": "bill", "age": "10", "gender": "male"}
peoples = [people_0, people_1, people_2]
for people in peoples:
for key, value in people.items():
print ("key:" + key + "\tvalue:" + value)
print ("\n")
结果
key:gender value:female
key:age value:18
key:name value:dana
key:gender value:male
key:age value:20
key:name value:david
key:gender value:male
key:age value:10
key:name value:bill
首先定义了三个字典,把这三个字典放入到peoples列表中。循环peoples列表,变量为people,
people其实指代的就是循环到的字典。people.items()返回的就是包含键值对的列表,又进行了for循环。打印每一个键值对。
在代码中经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息。
4.2 在字典中存储列表
有时候需要将列表存储早字典中,而不是将字典存储在列表中。
fruits = ["apple", "banana", "pear"]
balls = ["basketball", "football", "volleyball"]
computers = ["apple", "lenovo", "dell"]
map = {}
map["fruits"] = fruits
map["balls"] = balls
map["computers"] = computers
print (map)
结果
{'computers': ['apple', 'lenovo', 'dell'], 'balls': ['basketball', 'football', 'volleyball'], 'fruits': ['apple', 'banana', 'pear']}
注意,列表和字典的嵌套层级不应该太多。如果嵌套的层级比示例多的多,很可能有更简单的解决问题的方案。
4.3 在字典中存储字典
字典中嵌套字典,这样做的时候,会让代码很快的复杂起来。
people_0 = {"name": "dana", "age": "18", "gender": "female"}
people_1 = {"name": "david", "age": "20", "gender": "male"}
people_2 = {"name": "bill", "age": "10", "gender": "male"}
peoples = {}
peoples["dana"] = people_0
peoples["david"] = people_1
peoples["bill"] = people_2
print (peoples)
print (peoples["dana"])
结果
{'bill': {'gender': 'male', 'age': '10', 'name': 'bill'}, 'dana': {'gender': 'female', 'age': '18', 'name': 'dana'}, 'david': {'gender': 'male', 'age': '20', 'name': 'david'}}
{'gender': 'female', 'age': '18', 'name': 'dana'}
请注意,表示每位用户的字典结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂。