字典
思考:
场景1
如果有列表
li = ['Python','Java','C++'];
需要对"python"这个名字写错了,通过代码修改:
li[0]="Python"
如果列表的顺序发生了变化,如下
li =['Java','C++','Python'];
此时就需要修改下标,才能完成名字的修改
li[2]="Python"
有没有方法,即能存储多个数据,还能在访问元素的时候,很方便的就能定位到需要的那个元素呢>
答:字典
场景2:
学生信息列表,每个学生信息包括学号、姓名、年龄等,如何从中找到某个学生的信息?
>>> studens =[201801,"张三",18],[201802,"李四",19],[201803,"王二",17],...]
循环遍历?这样很麻烦。
实际生活中,我们还经常使用汉语字典,英汉词典等等。
程序中的字典
info ={"usrname":"Lilei","age":18,"Class":"one"}
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。字典是一种可变数据类型,且可存储任意类型对象。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
格式:
{key1:value1,key2:value2,.....}
描述:
1.键-值对中间用冒号(":")连接;
2.key:value组成字典里的一个元素;
3.键-值对(元素)之间用逗号(",")隔开;
3.整个字典用花括号"{}"包裹起来。
创建一个空字典
dict ={}
type(dict)
创建一个有多个值的字典
1.直接赋值法:d={key1:value1,key2:value2},如
>>> info={"userame":"Lilei","age":18,"Class":"one"}
>>> info
{'userame': 'Lilei', 'age': 18, 'Class': 'one'}
>>>
2.通过函数创建字典(强制转换)
#法1
>>> info = dict(usrname = "Lilei", age = 18, Class = "one")
>>> info
{'usrname': 'Lilei', 'age': 18, 'Class': 'one'}
#法2
>>> info = dict([['name', 'LiLei'], ['age', 18]])
>>> info
{'name': 'LiLei', 'age': 18}
#法3
>>> info = dict((('name', 'LiLei'), ('age', 18)))
>>> info
{'name': 'LiLei', 'age': 18}
#法4
>>> info = dict([('name', 'LiLei'), ('age', 18)])
>>> info
{'name': 'LiLei', 'age': 18}
#法5
>>> info = dict((['name', 'LiLei'], ['age', 18]))
>>> info
{'name': 'LiLei', 'age': 18}
3.通过字典的fromkeys方法创建字典
{'name': 'LiLei', 'age': 18} #如果没有指定默认值,默认为None;
>>> info =dict.fromkeys("Hello")
>>> info
{'H': None, 'e': None, 'l': None, 'o': None}
>>> info = dict.fromkeys(["Lilei","Lee","Jack"],"123456") #给每个元素设置默认值为"123456";
>>> info
{'Lilei': '123456', 'Lee': '123456', 'Jack': '123456'}
字典的常见操作
字典值的访问(查的一种)
字典是无序的,不能通过索引值来获取值。
>>> info=info[2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 2
>>>
- 通过键(key)访问值(value)
- key值不存在的时候,会报错。
>>> info={"usrname":"Lilei","age":18,"Class":"One"}
>>> info["usrname"] #通过关键字访问对应的值
'Lilei'
>>> info["age"]
18
>>> info["usname"] #没有对应的key,报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'usname
- 使用get访问值(value)
不确定字典中是否存在某个键而又想获取其值时,可以使用get方法,还可以设置默认值
- 当key不存在的,不会抛出异常,返回None。
>>> info ={"name":"LiLei","age":18}
>>> info.get("name")
'LiLei'
#当key不存在时,不会抛出异常,返回None
>>> info.get("job")
>>> type(info.get("job"))
<class 'NoneType'>
>>>
增
- 直接添加新键-值对
在使用 变量名[‘键’]=数据 时,这个"键"在字典中,不存在,那么就会新增这个元素:
>>> nfo = {"name": "LiLei", "age": 18}
>>> info["job"]="IT"
>>> info
{'name': 'LiLei', 'age': 18, 'job': 'IT'}
>>>
- dict.update(dict1)
把字典dic1的值/值对更新到dic里
- 当两个字典中的键不同时,把dic1的键插入到dic中
- 当两个字典中存在相同键时,dic1覆盖dit的键值
#当两个字典完全不相同时
>>> info ={"name":"LiLei","age":18}
>>> info1 ={"job":"IT","salary":10000}
>>> info.update(info1)
>>> info
{'name': 'LiLei', 'age': 18, 'job': 'IT', 'salary': 10000}
>>>info1
>>>{'job': 'IT', 'salary': 10000}
#当两个字典存在相同键时,会覆盖前面的键值
>>> info={"name":"LiLei","age":18}
>>> info2={"name":"Tom","salary":10000}
>>> info.update(info2)
>>> info
{'name': 'Tom', 'age': 18, 'salary': 10000}
>>> info2
{'name': 'Tom', 'salary': 10000}
>>>
删
- del dict[keys]
- 删除指定的元素/键-值对
- 没有返回值
>>> info={'name':'Tom','age':18,'salary':10000}
>>> del info["salary"]
>>> info
{'name': 'Tom', 'age': 18}
>>>
- del dict
- 删除整个字典
>>> info ={"name":"LiLei","age":18}
>>> del info
>>> info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'info' is not defined
>>>
- dict.clear()
- 清空整个字典
>>> info ={"name":"LiLei","age":18}
>>> info.clear()
>>> info
{}
>>>
- dict.popitem()
- 随机删除字典中的一组键值对
- 有返回值,以元组方式返回
- 应用不广泛
>>> info={'name':'Tom','age':18,'salary':10000}
>>> info.popitem()
('salary', 10000)
>>> info
{'name': 'Tom', 'age': 18}
>>>
改
字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改
- 直接修改
>>> info ={'name':'Tom','age':18,'salary':10000}
>>> info["name"] ="LiLei"
>>> info
{'name': 'LiLei', 'age': 18, 'salary': 10000}
>>>
- dict.setdefault()
- 键存在,不改动,返回字典中相应的值
- 键不存在,在字典中添加相应的键值对,并返回相应的值
# 键存在,不改动,返回字典中响应的值
>>> info ={'name':'Tom','age':18,'salary':10000}
>>> info.setdefault("age",20)
18
>>> info
{'name': 'Tom', 'age': 18, 'salary': 10000}
>>>
# 键不存在,在字典中添加相应的键值对,并返回相应的值
>>> info={'name':'Tom','age':18,'salary':10000}
>>> info.setdefault("job","IT")
'IT'
>>> info
{'name': 'Tom', 'age': 18, 'salary': 10000, 'job': 'IT'}
>>>
查
- dict.keys()
- 返回字典中的所有键(keys)
- dict.values()
- 返回字典中的所有值(values)
- dict.items()
- 返回字典中的所有键-值对(keys-values)
- 某元素是否存在:
- key in dict
- 存在,Ture
- 不存在,False
Python2中,可以用dict.has_key(),如果key在字典中,返回True;否则,返回False。
>>> info ={'name':'Tom','age':18,'salary':10000}
>>> info.keys()
dict_keys(['name', 'age', 'salary'])
>>> info.values()
dict_values(['Tom', 18, 10000])
>>> info.items()
dict_items([('name', 'Tom'), ('age', 18), ('salary', 10000)])
>>> "age" in info
True
>>> "job" in info
False
字典的遍历
(1)遍历字典的键(key)
info ={"usrname":"LiLei","age":18,"Class":"one"}
for key in info.keys():
print(key,end=" ")
# usrname age Class
(2)遍历字典的值(value)
info ={"usrname":"LiLei","age":18,"Class":"one"}
for value in info.values():
print(value,end=" ")
# LiLei 18 one
(3)遍历所有的项(items)
info ={"usrname":"LiLei","age":18,"Class":"one"}
for item in info.items():
print(item,end=" ")
# ('usrname', 'LiLei') ('age', 18) ('Class', 'one')
(4)遍历字典的键-值对(key-value)
info ={"usrname":"LiLei","age":18,"Class":"one"}
for key,value in info.items():
print(key,":",value,end=" ")
# usrname : LiLei age : 18 Class : one