python入门:字典初相识

473 阅读10分钟

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

在之前介绍过python的3种数据类型:字符串、列表list、元组,它们都是有序的数据类型。

本文中介绍一个无序的Python数据类型:字典。字典主要是用来存放具有映射关系的数据。

文章目录

字典特点

字典是python中经常使用的一种数据类型。字典是可以存储任意数据类型的数据,并且存储的数据也是可以修改的,这点和列表类似。字典的每个基本元素包含两个部分:键key和这个键对应的值value。

  • 键和值之间使用冒号隔开(涉及到的符号都是英文状态下)
  • 每对元素用逗号隔开
  • 整个数据放在大括号中

通过一个例子来说明:{"name":"小明","age":22,"sex":"男"}

在字典中,键是不同重复的,且是不可变的数据类型,值可以是任意的数据类型。元组是不可变的,所以可作为字典的键。列表是可变的,不能作为字典的键。键只支持不可变的数据类型

字典是没有顺序的,所以每次打印出来的顺序可能不同。

字典创建

字典的创建有两种方法:

  • 使用花括号{}创建
  • 使用dict函数创建

在使用花括号{}来创建字典时,花括号中应包含多个 key-value 对,key 与 value 之间用英文冒号隔开;多个 key-value 对之间用英文逗号隔开。

创建空字典

dic1 = dict()  # 空字典
dic1
{}
type(dic1)  # 查看类型
dict
dic2 = {}   # 花括号来创建
dic2
{}
type(dic2)
dict

花括号:只有一个键值对

dic3 = {"name":"小明"}
dic3
{'name': '小明'}
type(dic3)
dict

花括号:多个键值对

键一定是字符串类型,值可以任意类型的数据,比如下面的:字符串、数值、列表等

dic4 = {"name":"小明",  # 字符串
        "age":25,  # 数值
        89:111,
        "sex":"男",  # 字符串
        "score":[100,98,99]   # 列表
       }
dic4
{'name': '小明', 'age': 25, 89: 111, 'sex': '男', 'score': [100, 98, 99]}
type(dic4)
dict

dict函数:多个键值对

# 列表中存放元组
data1 = [("name","小明"),
         ("age",25),
         ("score",[100,99,98])
        ]  

dic5 = dict(data1)
dic5
{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
# 列表中嵌套列表

data2 = [["name","小明"],
         ["age",25],
         ["score",[100,99,98]]
        ]  

dic6 = dict(data2)
dic6
{'name': '小明', 'age': 25, 'score': [100, 99, 98]}

dict函数:通过指定关键字参数创建

还可通过为 dict 指定关键字参数创建字典,此时字典的 key 不允许使用表达式

dic7 = dict(name="小明",age=25,sex="男")  # name不要放在引号中
dic7
{'name': '小明', 'age': 25, 'sex': '男'}
type(dic7)
dict

dict函数:通过zip函数创建

data3 = zip(("name","age","sex"),("小明",25,"男"))

data3
<zip at 0x1122e2870>
dict8 = dict(data3)
dict8
{'name': '小明', 'age': 25, 'sex': '男'}

字典操作

键是字典中关键的数据,所有的值都是通过自己的键来进行访问的,所以我们必须掌握各个基于键key的操作。

  • 通过key访问value
  • 通过key添加键值对
  • 通过key删除键值对
  • 通过key修改键值对
  • 判断指定的键值对是否存在

操作1:通过key访问value

下面的代码演示的是如何通过key来访问对应的value

dic5
{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
dic5["name"]
'小明'
dic5["score"]
[100, 99, 98]

如果键不存在,则会引起报错:

dic5["sex"]
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-18-8c2513616156> in <module>
----> 1 dic5["sex"]


KeyError: 'sex'

操作2:添加键值对key-value

dic5  # 前
{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
dic5["address"] = "广东省深圳市"  # 增加键值对
dic5  # 后
{'name': '小明', 'age': 25, 'score': [100, 99, 98], 'address': '广东省深圳市'}

再添加一个新的键值对

dic5["birth"] = "1993-08-01"

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-01'}

操作3:删除键值对

dic6
{'name': '小明', 'age': 25, 'score': [100, 99, 98]}
# 1、删除

del dic6["name"]
dic6  
{'age': 25, 'score': [100, 99, 98]}

我们发现name这个键值对不见了,已经被删除

del dic6["score"]   
dic6
{'age': 25}

再次删除后,score这个键值对也不见了

操作4:修改键值对

修改键值对,主要是对某个键中的值进行修改;新赋值的value会覆盖掉原来的值。

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-01'}
# 1、修改name
dic5["name"] = "小红"  

dic5
{'name': '小红',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-01'}
dic5["name"] + "来自" + dic5["address"]
'小红来自广东省深圳市'
# 2、修改日期

dic5["birth"] = "1993-08-08"
dic5
{'name': '小红',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}

操作5:判断键值对是否存在

如果要判断字典是否包含指定的 key,则可以使用 in 或 not in 运算符。需要指出的是,这两个运算符都是基于字典的 key 来判断的

dic5
{'name': '小红',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}
"sex" in dic5  
False
"sex" not in dic5   
True
  • 上面:性别sex并不在字典dic5中,结果为False:
  • 下面:姓名name在字典dic5中,结果为True。
"name" in dic5
True

字典操作小结

通过上面的例子,我们对比列表和字典的索引:

  • 键key是字典中的关键,相当于是字典的索引,但是这个索引不一定是整数型。
  • 字典的key值是任意的不可变数据类型:数值型、字符串、元组等
  • 列表中的索引总是从0开始、连续增加的;但如果字典中的key都是整数类型,也可以不从0开始,不连续
  • 列表中不允许对不存在的索引赋值;字典允许对不存在的key赋值,这样就像是增加了一个键值对

字典方法

Python中的字典是由dict类代表,可以使用dir(dict)来查看该类包含哪些方法

查看字典方法

print(dir(dict))  # 查看字典对的方法
['__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() 方法之后,该字典就会变成一个空字典。

dic7   # 执行前
{'name': '小明', 'age': 25, 'sex': '男'}
dic7.clear()  # 执行
dic7  # 执行后变成空字典
{}

字典方法2:get()

方法就是通过key来获取value。当我们使用方括号语法访问并不存在的key时,字典会引发错误。但是如果使用get方法,则不会报错,会返回None,看具体的例子:

dic5
{'name': '小红',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}
print(dic5.get("name"))  # 访问存在的键
小红
print(dic5.get("birth"))
1993-08-08

下面的sex键不存在,但是并没有报错,而是输出None:

print(dic5.get("sex"))  
None

使用花括号则报错:

dic5["sex"]
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-43-8c2513616156> in <module>
----> 1 dic5["sex"]


KeyError: 'sex'

字典方法3:update

  • 如果键存在,则用来更新字典中键值对的取值;
  • 如果键值对不存在,则会被添加到字典中去:
dic5
{'name': '小红',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}
dic5.update({"name":"小明"})  # 更新现有key
dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}
dic5.update({"sex":"男"})   #  键不存在,就是更新
dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08',
 'sex': '男'}

字典方法4:pop()

用于获取指定key对应的value,并删除整个键值对key-value。

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08',
 'sex': '男'}
dic5.pop("sex")
'男'

查看下面的字典,我们发现sex这个键值对已经被删除了:

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}

字典方法5:popitem()

该方法是用于随机弹出一个字典中的键值对。其实并不是随机。

Python列表的pop方法总是弹出最后一个元素。字典的popitem()方法也是弹出最后一个key-value键值对

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'birth': '1993-08-08'}
dic5.popitem()  # 最后一个
('birth', '1993-08-08')
dic4
{'name': '小明', 'age': 25, 89: 111, 'sex': '男', 'score': [100, 98, 99]}
k,v = dic4.popitem()  # 通过序列解包分别赋值给两个变量

print(k)
print(v)
score
[100, 98, 99]

字典方法6:setdefault()

setdefault() 方法也用于根据 key 来获取对应 value 的值。

  • 如果要获取的 key 在字典中不存在时,可以为这个key 设置一个默认的 value,然后再返回该 key 对应的 value。
  • 如果key存在字典中,直接返回key对应的值value
dic5
{'name': '小明', 'age': 25, 'score': [100, 99, 98], 'address': '广东省深圳市'}
dic5.setdefault("sex","男")   # dic5中不存在sex的键
'男'
dic5.setdefault("name","小红") # name键存在,则返回字典中的值
'小明'

字典方法7:fromkeys()

该方法是使用给定的多个key创建字典,这些key对应的value默认都是None;也可以额外传入一个参数作为默认的value

dic8 = dict.fromkeys(["小红","小明"])  # 列表形式
dic8
{'小红': None, '小明': None}

上面的结果表示:方法默认的值都是None

dict.fromkeys(("小红","小明"))   #  元组形式
{'小红': None, '小明': None}

还可以传入一个默认的值:

dict.fromkeys(["小明","小周"],22)
{'小明': 22, '小周': 22}

字典3大法宝

字典法宝1:keys()

用来查看字典的全部键

dic5
{'name': '小明',
 'age': 25,
 'score': [100, 99, 98],
 'address': '广东省深圳市',
 'sex': '男'}
dic5.keys()
dict_keys(['name', 'age', 'score', 'address', 'sex'])
for key in dic5.keys():  # 循环遍历每个key
    print(key)
name
age
score
address
sex

通过下面的代码,可以发现:当我们遍历字典的时候,默认是取字典的键:

for i in dic5:
    print(i)
name
age
score
address
sex

字典法宝2:values()

用来返回字典中的所有值

dic5.values()
dict_values(['小明', 25, [100, 99, 98], '广东省深圳市', '男'])
list(dic5.values())
['小明', 25, [100, 99, 98], '广东省深圳市', '男']

字典法宝3:items()

用来返回全部的键值对

dic5.items()
dict_items([('name', '小明'), ('age', 25), ('score', [100, 99, 98]), ('address', '广东省深圳市'), ('sex', '男')])
for item in dic5.items():
    print(item)
('name', '小明')
('age', 25)
('score', [100, 99, 98])
('address', '广东省深圳市')
('sex', '男')

既然通过items()能够直接输出键值对,我们可以直接获取键、值

for k,v in dic5.items():
    print(k,v)
name 小明
age 25
score [100, 99, 98]
address 广东省深圳市
sex 男