python字典 (dict)

python中的字典(dict)是数据的无序集合, 与列表,元组,集合将单个值作为存储数据不同, 字典存储的是key:value对, 字典中存储的数据总是成对的, key被称之为键, value称之为值, 值可以是任意数据且可重复, 而键不可重复且必须是可hash的。

1. 创建一个字典

1.1 创建字典

字典是一个容器类型数据,字典里存储的是键值对,键值对用冒号分割key与value,每个键值(key-value)对用逗号分割,整个字典包裹在花括号{}中。

下面是一个字典的示例

contacts_dict = {
    "小王": '13892339876',
    "小张": '13898320987',
    "小李": '13890348745'
}

如果字典里没有任何键值对,那么它就是一个空字典

empty_dict = {}

如果想知道字典中有多少数据,可以使用len函数来获取

print(len(contacts_dict))

想要知道一个key是否在字典中存在,使用in 或者not in 成员操作符

print('小王' in contacts_dict)

1.2 什么数据可以做key,什么数据可以做value

什么数据可以做key

并不是所有的数据都可以做key,想成为key,是有要求的,数据必须是可hash的,下面罗列的5种数据类型是可以做字典key的数据类型

  1. bool
  2. int
  3. float
  4. 字符串
  5. 元组

下面3中数据类型不可以做字典的key

  1. 列表
  2. 集合
  3. 字典

凡是可变对象都不可以做字典的key,凡是不可变对象,都可以做字典的key。

bool类型的数据只有True和False两个值,虽然他们可以做字典的key,但实践时,你最好不要这样做,会导致古怪的问题,比如下面的代码

int_dict = {
    1: '1做key',
    True: 'True做key'
}

print(int_dict)

执行代码,输出结果为

{1: 'True做key'}

是不是很奇怪,明明两个键值对,实际输出却只有一个,而且key从True变成了1,这是怎么一回事?

print(1==True)      # 判断1是否与True相等
print(issubclass(bool, int))  # 判断bool类型是否为int类型的子类

程序输出结果为

True
True

1 和 True是相等的,0和False是相等的,bool类型是int类型的子类,这就是原因,在定义字典时,第二个键值对覆盖了前面的键值对,在字典中,key是不会出现重复的,后加入的总是会覆盖前面的。

什么数据可以做value

对于value,字典没有任何要求,任何数据都可以做value,包括列表,集合,甚至是字典。

dic = {
    'list': [2, 3, 4],
    'set': set([2, 4, 6]),
    'dict': {
        '小明': 99
    }
}

2. 新增键值对和修改value

下面的字典里存储了学生的语文考试分数

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

现在你发现,小丽的分数还没有写入到字典中,她考了100分,你需要新增一个键值对,记录小丽的分数

score_dict['小丽'] = 100

这就是字典里新增键值对的方式,一对中括号紧跟在字典后面,中括号里写key,等号右侧写value,是不是很简单。

如果一个key原本已经存在了,那么上面这种操作方式会产生什么样的结果呢?

score_dict['小明'] = 99

'小明'这个key已经存在于字典中了,上面这种写法尝试新增,但不会发生新增这种事情,因为字典里的key不允许重复,因此,最终的结果是value被修改,字典被修改成

score_dict = {
    '小明': 99,
    '小刚': 98,
    '小红': 94
}

简单总结一下,对于score_dict['小明'] = 99 这种代码,如果key不存在,那么就会新增键值对,如果key已经存在,就会修改value

3. 访问字典里的值

想要访问字典里的值,必须提供key,对字典的任何操作,都必须通过key才能进行,就如同对列表的操作都必须通过索引才能进行一样。

比如你想知道小红的语文分数,那你应该这样写代码

score_dict = {
    '小明': 99,
    '小刚': 98,
    '小红': 94
}

print(score_dict['小红'])

score_dict['小红'] 这种写法的意思就是获取'小红'这个key所对应的value,如果你提供了一个并不存在的key,则会引发一个KeyError错误

print(score_dict['小丽'])

错误为

Traceback (most recent call last):
  File "/Users/kwsy/PycharmProjects/pythonclass/mytest/demo.py", line 7, in <module>
    print(score_dict['小丽'])
KeyError: '小丽'

4. 删除字典里的键值对

现在想要从字典里删除小红的成绩,和访问字典里的key一样,你必须指定要删除的key

del score_dict['小红']

除了这种方法外,你还可以使用字典的pop方法

score_dict.pop('小红')

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案