Python入门-字典初相识
在之前介绍过python的3种数据类型:字符串、列表list、元组,它们都是有序的数据类型。
本文中介绍一个无序的Python数据类型:字典。字典主要是用来存放具有映射关系的数据。
字典特点
字典是python中经常使用的一种数据类型。字典是可以存储任意数据类型的数据,并且存储的数据也是可以修改的,这点和列表类似。字典的每个基本元素包含两个部分:键key和这个键对应的值value。
- 键和值之间使用冒号隔开(涉及到的符号都是英文状态下)
- 每对元素用逗号隔开
- 整个数据放在大括号中
通过一个例子来说明:{"name":"小明","age":22,"sex":"男"}
在字典中,键是不同重复的,且是不可变的数据类型,值可以是任意的数据类型。元组是不可变的,所以可作为字典的键。列表是可变的,不能作为字典的键。键只支持不可变的数据类型
字典是没有顺序的,所以每次打印出来的顺序可能不同。
字典创建
字典的创建有两种方法:
- 使用花括号
{}
创建 - 使用dict函数创建
在使用花括号{}来创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开;多个 key-value 对之间用英文逗号隔开。
创建空字典
代码语言:javascript复制dic1 = dict() # 空字典
dic1
代码语言:javascript复制{}
代码语言:javascript复制type(dic1) # 查看类型
代码语言:javascript复制dict
代码语言:javascript复制dic2 = {} # 花括号来创建
dic2
代码语言:javascript复制{}
代码语言:javascript复制type(dic2)
代码语言:javascript复制dict
花括号:只有一个键值对
代码语言:javascript复制dic3 = {"name":"小明"}
dic3
代码语言:javascript复制{'name': '小明'}
代码语言:javascript复制type(dic3)
代码语言:javascript复制dict
花括号:多个键值对
键一定是字符串类型,值可以任意类型的数据,比如下面的:字符串、数值、列表等
代码语言:javascript复制dic4 = {"name":"小明", # 字符串
"age":25, # 数值
89:111,
"sex":"男", # 字符串
"score":[100,98,99] # 列表
}
dic4
代码语言:javascript复制{'name': '小明', 'age': 25, 89: 111, 'sex': '男', 'score': [100, 98, 99]}
代码语言:javascript复制type(dic4)
代码语言:javascript复制dict
dict函数:多个键值对
代码语言:javascript复制# 列表中存放元组
data1 = [("name","小明"),
("age",25),
("score",[100,99,98])
]
dic5 = dict(data1)
dic5
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
代码语言:javascript复制# 列表中嵌套列表
data2 = [["name","小明"],
["age",25],
["score",[100,99,98]]
]
dic6 = dict(data2)
dic6
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
dict函数:通过指定关键字参数创建
还可通过为 dict 指定关键字参数创建字典,此时字典的 key 不允许使用表达式
代码语言:javascript复制dic7 = dict(name="小明",age=25,sex="男") # name不要放在引号中
dic7
代码语言:javascript复制{'name': '小明', 'age': 25, 'sex': '男'}
代码语言:javascript复制type(dic7)
代码语言:javascript复制dict
dict函数:通过zip函数创建
代码语言:javascript复制data3 = zip(("name","age","sex"),("小明",25,"男"))
data3
代码语言:javascript复制<zip at 0x1122e2870>
代码语言:javascript复制dict8 = dict(data3)
dict8
代码语言:javascript复制{'name': '小明', 'age': 25, 'sex': '男'}
字典操作
键是字典中关键的数据,所有的值都是通过自己的键来进行访问的,所以我们必须掌握各个基于键key的操作。
- 通过key访问value
- 通过key添加键值对
- 通过key删除键值对
- 通过key修改键值对
- 判断指定的键值对是否存在
操作1:通过key访问value
下面的代码演示的是如何通过key来访问对应的value
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
代码语言:javascript复制dic5["name"]
代码语言:javascript复制'小明'
代码语言:javascript复制dic5["score"]
代码语言:javascript复制[100, 99, 98]
如果键不存在,则会引起报错:
代码语言:javascript复制dic5["sex"]
代码语言:javascript复制---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-18-8c2513616156> in <module>
----> 1 dic5["sex"]
KeyError: 'sex'
操作2:添加键值对key-value
代码语言:javascript复制dic5 # 前
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
代码语言:javascript复制dic5["address"] = "广东省深圳市" # 增加键值对
dic5 # 后
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98], 'address': '广东省深圳市'}
再添加一个新的键值对
代码语言:javascript复制dic5["birth"] = "1993-08-01"
dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-01'}
操作3:删除键值对
代码语言:javascript复制dic6
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
代码语言:javascript复制# 1、删除
del dic6["name"]
代码语言:javascript复制dic6
代码语言:javascript复制{'age': 25, 'score': [100, 99, 98]}
我们发现name这个键值对不见了,已经被删除
代码语言:javascript复制del dic6["score"]
代码语言:javascript复制dic6
代码语言:javascript复制{'age': 25}
再次删除后,score这个键值对也不见了
操作4:修改键值对
修改键值对,主要是对某个键中的值进行修改;新赋值的value会覆盖掉原来的值。
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-01'}
代码语言:javascript复制# 1、修改name
dic5["name"] = "小红"
dic5
代码语言:javascript复制{'name': '小红',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-01'}
代码语言:javascript复制dic5["name"] "来自" dic5["address"]
代码语言:javascript复制'小红来自广东省深圳市'
代码语言:javascript复制# 2、修改日期
dic5["birth"] = "1993-08-08"
dic5
代码语言:javascript复制{'name': '小红',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
操作5:判断键值对是否存在
如果要判断字典是否包含指定的 key,则可以使用 in 或 not in 运算符。需要指出的是,这两个运算符都是基于字典的 key 来判断的
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小红',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
代码语言:javascript复制"sex" in dic5
代码语言:javascript复制False
代码语言:javascript复制"sex" not in dic5
代码语言:javascript复制True
- 上面:性别sex并不在字典dic5中,结果为False:
- 下面:姓名name在字典dic5中,结果为True。
"name" in dic5
代码语言:javascript复制True
字典操作小结
通过上面的例子,我们对比列表和字典的索引:
- 键key是字典中的关键,相当于是字典的索引,但是这个索引不一定是整数型。
- 字典的key值是任意的不可变数据类型:数值型、字符串、元组等
- 列表中的索引总是从0开始、连续增加的;但如果字典中的key都是整数类型,也可以不从0开始,不连续
- 列表中不允许对不存在的索引赋值;字典允许对不存在的key赋值,这样就像是增加了一个键值对
字典方法
Python中的字典是由dict类代表,可以使用dir(dict)来查看该类包含哪些方法
查看字典方法
代码语言:javascript复制print(dir(dict)) # 查看字典对的方法
代码语言:javascript复制['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
字典方法1:clear()
用于清空字典中所有的 key-value 对,对一个字典执行 clear() 方法之后,该字典就会变成一个空字典。
代码语言:javascript复制dic7 # 执行前
代码语言:javascript复制{'name': '小明', 'age': 25, 'sex': '男'}
代码语言:javascript复制dic7.clear() # 执行
代码语言:javascript复制dic7 # 执行后变成空字典
代码语言:javascript复制{}
字典方法2:get()
方法就是通过key来获取value。当我们使用方括号语法访问并不存在的key时,字典会引发错误。但是如果使用get方法,则不会报错,会返回None,看具体的例子:
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小红',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
代码语言:javascript复制print(dic5.get("name")) # 访问存在的键
代码语言:javascript复制小红
代码语言:javascript复制print(dic5.get("birth"))
代码语言:javascript复制1993-08-08
下面的sex键不存在,但是并没有报错,而是输出None:
代码语言:javascript复制print(dic5.get("sex"))
代码语言:javascript复制None
使用花括号则报错:
代码语言:javascript复制dic5["sex"]
代码语言:javascript复制---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-43-8c2513616156> in <module>
----> 1 dic5["sex"]
KeyError: 'sex'
字典方法3:update
- 如果键存在,则用来更新字典中键值对的取值;
- 如果键值对不存在,则会被添加到字典中去:
dic5
代码语言:javascript复制{'name': '小红',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
代码语言:javascript复制dic5.update({"name":"小明"}) # 更新现有key
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
代码语言:javascript复制dic5.update({"sex":"男"}) # 键不存在,就是更新
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08',
'sex': '男'}
字典方法4:pop()
用于获取指定key对应的value,并删除整个键值对key-value。
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08',
'sex': '男'}
代码语言:javascript复制dic5.pop("sex")
代码语言:javascript复制'男'
查看下面的字典,我们发现sex这个键值对已经被删除了:
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
字典方法5:popitem()
该方法是用于随机弹出一个字典中的键值对。其实并不是随机。
代码语言:javascript复制Python列表的pop方法总是弹出最后一个元素。字典的popitem()方法也是弹出最后一个key-value键值对
dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'birth': '1993-08-08'}
代码语言:javascript复制dic5.popitem() # 最后一个
代码语言:javascript复制('birth', '1993-08-08')
代码语言:javascript复制dic4
代码语言:javascript复制{'name': '小明', 'age': 25, 89: 111, 'sex': '男', 'score': [100, 98, 99]}
代码语言:javascript复制k,v = dic4.popitem() # 通过序列解包分别赋值给两个变量
print(k)
print(v)
代码语言:javascript复制score
[100, 98, 99]
字典方法6:setdefault()
setdefault() 方法也用于根据 key 来获取对应 value 的值。
- 如果要获取的 key 在字典中不存在时,可以为这个key 设置一个默认的 value,然后再返回该 key 对应的 value。
- 如果key存在字典中,直接返回key对应的值value
dic5
代码语言:javascript复制{'name': '小明', 'age': 25, 'score': [100, 99, 98], 'address': '广东省深圳市'}
代码语言:javascript复制dic5.setdefault("sex","男") # dic5中不存在sex的键
代码语言:javascript复制'男'
代码语言:javascript复制dic5.setdefault("name","小红") # name键存在,则返回字典中的值
代码语言:javascript复制'小明'
字典方法7:fromkeys()
该方法是使用给定的多个key创建字典,这些key对应的value默认都是None;也可以额外传入一个参数作为默认的value
代码语言:javascript复制dic8 = dict.fromkeys(["小红","小明"]) # 列表形式
dic8
代码语言:javascript复制{'小红': None, '小明': None}
上面的结果表示:方法默认的值都是None
代码语言:javascript复制dict.fromkeys(("小红","小明")) # 元组形式
代码语言:javascript复制{'小红': None, '小明': None}
还可以传入一个默认的值:
代码语言:javascript复制dict.fromkeys(["小明","小周"],22)
代码语言:javascript复制{'小明': 22, '小周': 22}
字典3大法宝
法宝1:keys()
用来查看字典的全部键
代码语言:javascript复制dic5
代码语言:javascript复制{'name': '小明',
'age': 25,
'score': [100, 99, 98],
'address': '广东省深圳市',
'sex': '男'}
代码语言:javascript复制dic5.keys()
代码语言:javascript复制dict_keys(['name', 'age', 'score', 'address', 'sex'])
代码语言:javascript复制for key in dic5.keys(): # 循环遍历每个key
print(key)
代码语言:javascript复制name
age
score
address
sex
通过下面的代码,可以发现:当我们遍历字典的时候,默认是取字典的键:
代码语言:javascript复制for i in dic5:
print(i)
代码语言:javascript复制name
age
score
address
sex
字典法宝2:values()
用来返回字典中的所有值
代码语言:javascript复制dic5.values()
代码语言:javascript复制dict_values(['小明', 25, [100, 99, 98], '广东省深圳市', '男'])
代码语言:javascript复制list(dic5.values())
代码语言:javascript复制['小明', 25, [100, 99, 98], '广东省深圳市', '男']
字典法宝3:items()
用来返回全部的键值对
代码语言:javascript复制dic5.items()
代码语言:javascript复制dict_items([('name', '小明'), ('age', 25), ('score', [100, 99, 98]), ('address', '广东省深圳市'), ('sex', '男')])
代码语言:javascript复制for item in dic5.items():
print(item)
代码语言:javascript复制('name', '小明')
('age', 25)
('score', [100, 99, 98])
('address', '广东省深圳市')
('sex', '男')
既然通过items()能够直接输出键值对,我们可以直接获取键、值
代码语言:javascript复制for k,v in dic5.items():
print(k,v)
代码语言:javascript复制name 小明
age 25
score [100, 99, 98]
address 广东省深圳市
sex 男