字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通。

Python字典的定义

字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔。

键必须是不可变类型,一般使用字符串,数字,和元组也可以但用的不多。

值可以是任意数据类型。

>>> a = {}      # 空字典
>>> b = {
    'name': '九柄',
    'age': 18,
    'hobby': ['运动', 'meizi'],
    'friends': [
        {'name': '刘德华'},
        {'name': '张学友'}
    ]
}
>>> print(type(a))
< class 'dict' >
>>> print(type(b))
< class 'dict' >

Python字典的常用操作

字典的基本操作分为:增、删、改、查。

  • ”查“ 主要是去获取列表的某一个元素或者是多个元素,通过索引和切片可以获取。
  • ”增“ 主要是对这个字典当中去添加一个新的元素。
  • “删” 主要指我们对字典当中的某元素进行删除。
  • “改”主要是这个对这个字典当中的元素去进行修改。

Python字典的查询

字典通过键作为索引来获取对应的值。

>>> b = {
    'name': '心蓝',
    'age': 18,
    'hobby': ['运动', 'meizi'],
    'friends': [
        {'name': '刘德华'},
        {'name': '张学友'}
    ]
}
>>> print(b['name'])
'心蓝'
>>> print(b['hobby'][-1])
'meizi'

这种方式很好的将键和值联系起来,就像查字典一样。

Python字典是否存在key

如果想判断某个 key 是不是已经存在,可以直接使用 in 来判断:

print("name" in b)

Python字典的键可以是列表吗?

关于 Python 字典的键,始终需要注意的是:

  • 键不能重复
  • 键必须可哈希,更直白一点,键必须是不可变数据类型

列表是可变的数据类型,所以不能作为字典的键。 同样的,字典,集合这一类的可变数据类型都不能作为字典的键。

Python字典的键可以是元组吗?

元组是不可变的,可以作为字典的键。

同样的,字符串、整型、浮点数、布尔值都是不可变的,所以都可以作为字典的键。

Python字典的值允许重复吗

既然字典的键不能重复,那值可以重复吗?

答案是可以的,字典的值几乎不会做任何限制,你可以存储任何的数据类型,任何的数据值。

不同的键对应相同的值,完全是合理的:

a = {
    "my_name": "jiubing",
    "your_name": "jiubing"
}

Python字典取值的几种方法

取值最经典对的方法是通过中括号取值。

>>> d = {'name': '九柄', 'age': 18}
>>> d["name"]
九柄

但这种方式有个弊端,当取的 key 不存在时,会报错。 比如我取一个 hobby ,因为不存在,会触发 keyerror 错误。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'keyerror'

为了避免这种情况,我比较习惯用 get 方法,当 key 不存在的时候,可以指定一个默认值 None, 不会引发错误。

d = {'name': '九柄', 'age': 18}
d.get("hobby", None)

Python字典添加元素

字典添加元素和修改元素的语法是一样的。

如果键不存在,则添加元素。

>>> d = {'name':'九柄'}
>>> d['age'] = 18
>>> print(d)
{'name': '九柄', 'age': 18}

如果键存在则修改字典

>>> d = {'name': '九柄'}
>>> d['name'] = 'jiubing'
>>> print(d)
{'name': 'jiubing'}

Python字典删除元素

  • pop(key[,d])

删除指定的键对应的值,并返回该值,如果键不存在则返回默认值d,如果没有给定d,则抛出异常

>>> d = {'name': 'jiubing', 'age': 18}
>>> d.pop('age')
18
>>> print(d)
{'name': 'jiubing'}
>>> d.pop('age')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'age'
>>> d.pop('age', -1)
-1
  • .popitem()

任意删除字典中的一个键值对,并以二元元组(key,value)的形式返回

>>> d = {'name': 'jiubing', 'age': 18}
>>> d.popitem()
('age', 18)

Python字典合并

还可以通过方法.update(new_dict),将new_dict合并

>>> d = {'name':'九柄'}
>>> new = {'age':18, 'gender':'男'}
>>> d.update(new)
>>> print(d)
{'name': '九柄', 'age': 18, 'gender': '男'}

当有重复key的时候会覆盖

>>> d.update({'sex': '女','height': 170})
>>> print(d)
{'name': 'xinlan', 'age': 18, 'sex': '女', 'height': 170}

Python字典遍历

遍历字典使用 for 循环语法,但是要注意要获取字典的 items() 方法, 通过 items() 可以同时得到键值对,element 是一个元组。

new = {'age':18, 'gender':'男'}
for element in new.items():
    #element是键值对
 print(element)

如果一不小心把 items() 落掉了,则只能得到 key:

for element in new:
 #element只有key
 print(element)

如果只想获取值,则加上 values(), 快来验证下吧。

for element in new.values():
#element只有value
print(element)

Python字典排序

Python的 key, value 一般按照先添加,先展示的顺序展示。 如果想对字典排序,就要改变键值对的展示顺序。 下面是一种比较优雅的实现,但用了一些还没讲的内容。

可以为key参数值指定lambda表达式,代码如下:

y1 = {k: v for k, v in sorted(x.items(), 
                              key=lambda item: item[1])} 
print(y1) 
# 按值降序排列 
y2 = {k: v for k, v in sorted(x.items(), 
                              key=lambda item: item[1], reverse=True)} 
print(y2) 

这段代码使用了for-in表达式生成了字典,其中x是待排序的字典。items获取了key-value对。而lambda表达式的item就是当前的key-value对。item[0]表示key,item[1]表示value,所以使用item[1],就表示按value排序,而使用item[0],就是按key排序。

总结

字典的操作是非常丰富的,除了上面讲的内容,还有一些进阶操作比如 setdefaultdict 、默认字典,排序字典,都还没涉及到,后面出专门的文章进行说明。

Python自学教程7:字典类型有什么用的更多相关文章

  1. Python自学教程8-数据类型有哪些注意事项

    不知不觉,python自学教程已经更新到第八篇了,再有几篇,基本的语法就介绍完了. 今天来总结一下数据类型有哪些需要注意的地方. 元组注意事项 元组是另一种经常使用到的数据类型,看上去和列表差不多.它 ...

  2. Python自学教程1-安装pycharm和执行环境

    Python虽然简单,但是很多没有接触过的学起来还是比较困难的.因此很多人会报班去学,我觉得不需要花那个钱,只要方向正确,加上核心知识点的提炼,自学一个月左右就能上手. 我尝试写下这个自学教程,只讨论 ...

  3. VBA_Excel_教程:字典类型

    VBA中的字典类型需要添加Microsoft Scripting Runtime引用,在Tools菜单下添加 Sub testDic() Dim strV As String Dim key As S ...

  4. Python自学教程2:大牛们怎么写注释

    在还没开始学代码前,就要先学会写注释.不会写注释的程序员会遭到鄙视和唾弃,甚至在工作中会被人穿小鞋.注释也不是随便写一下就行,用好注释还是有点讲究的. 注释有什么用? 注释(Comments)主要是向 ...

  5. .Net程序员之Python基础教程学习----字典的使用 [Third Day]

      今天学习了字典的使用, 所谓的字典其实就是键值对数据, 一个字典里面有唯一的Key对应一个value,Key是唯一的,Value不唯一. 在.net添加相同的Key会报错,在Python,若出现相 ...

  6. Python自学教程12-类和对象怎么用

    Python是一门现代化的编程语言,也是一门面向对象的编程语言. 现代编程语言几乎都支持面向对象编程,面向对象编程是最有效的软件编写方法之一.你可以用类和对象来表示现实当中的任何的事物和行为. 编写类 ...

  7. Python自学教程5-字符串有哪些常用操作

    任何编程语言,不管是Python.Java 还是 Golang, 字符串都是最重要的一种数据类型. 但是字符串的操作又很多,初学者经常毫无头绪,不知道从哪儿学起,也不知道哪些操作用得多,今天九柄就和你 ...

  8. 『Python基础-10』字典

    # 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...

  9. Python基础教程2上的一处打印缺陷导致的代码不完整#1

    #1对代码的完善的 出现打印代码处缺陷截图: 图片上可以看到,定义的request根本没有定义它就有了.这个是未定义的,会报错的,这本书印刷问题,这个就是个坑,我也是才发现.花了点时间脱坑. 现在发完 ...

随机推荐

  1. 一张图进阶 RocketMQ - 整体架构

    前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!如果你第一次看到这个系列,墙裂建议你打开链接.觉得不错的话,记得点 ...

  2. 在sqlbolt上学习SQL

    在sqlbolt上学习SQL 该网站能够学习sql基础,并且能在网页中直接输入sql语句进行查询. 学习网站原网址https://sqlbolt.com/(!部分指令该网站不支持,且存在一些bug!) ...

  3. 皓远的第一次博客作业(pta题目集——1-3)

    题目集总结: 前言: 一. 知识点运用: ①    Java入门的基础语法(循环,判断,字符串,数组等等),Java的基础类运用,类与对象关系调用,类间关系(聚合). ②    引(类与对象): 对象 ...

  4. MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI

    1. 前言 距离上次发<MAUI初体验:爽>一文已经过去2个月了,本计划是下半年或者明年再研究MAUI的,现在计划提前啦,因为我觉得MAUI Blazor挺有意思的:在Android.iO ...

  5. 基于web3D展示技术的煤矿巷道3D可视化系统

    地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...

  6. 关于Vue在面试中常常被提到的几点(持续更新……)

    1.Vue项目中为什么要在列表组件中写key,作用是什么? 我们在业务组件中,会经常使用循环列表,当时用v-for命令时,会在后面写上:key,那么为什么建议写呢? key的作用是更新组件时判断两个节 ...

  7. RPA应用场景-公积金贷款业务数据整合和报送

    场景概述 公积金贷款业务数据整合和报送 所涉系统名称 个贷系统.公积金管理系统 人工操作(时间/次) 0.5小时 所涉人工数量1000操作频率 每日 场景流程 1.机器人整理个人贷款信息.个人贷款账户 ...

  8. Java去除字符串中 除数字和逗号以外的符号

    例: public static void main(String[] args) { // 去除字符串中 除数字和逗号以外的符号 String str = "_1066,_1068,_10 ...

  9. C++ 练气期之二维数组与矩阵运算

    1. 前言 C++中的一维数组可以存储线性结构的数据,二维数组可以存储平面结构的数据.如班上所有学生的各科目成绩就有二个维度,学生姓名维度和科目成绩维度. 这样的表格数据可以使用二维数组进行存储. 当 ...

  10. 等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类

    资源类:包子类 设置包子的属性 皮 陷 包子的状态:有 true 没有 false public class BaoZi { //皮 String pi; //陷 String xian; //包子的 ...