1.1 概述

说白了就是键值对的映射关系

不会丢失数据本身关联的结构,但不关注数据的顺序

是一种可变类型

格式:dic = {键:值, 键:值}
  • 键的类型:字典的键可以是任何不可变的类型,如浮点数,字符串,元组

1.2 函数dict

可以从其他映射或键值对创建字典

items = [('name', 'Gumby'), ('age', 42)]
d =dict(items)
print(d)
> {'name': 'Gumby', 'age': 42}
d = dict(name='Gumby', age=42)
print(d)
> {'name': 'Gumby', 'age': 42}

1.3 字典的基本操作

num = len(d) # 返回字典的键值对数量
str1 = d[键] # 参数为键 返回值为对应的值
d[键] = '值' # 将tom赋值给name1键
test = 键 in 字典名字 # 检查name3键是否在字典中
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12,
'name_c':'lily', 'age3':14}
num = len(d) # 返回字典的键值对数量
print('num=' + str(num))
> num=6
str1 = d['name_a'] # 参数为键 返回值为对应的值
print('name_a=' + str1)
> name_a=Gumby
d['name_a'] = 'tom' # 将tom赋值给name1键
print('name_a=' + d['name_a'])
> name_a=tom
test = 'name_c' in d # 检查name3键是否在字典中
print(test)
> True

1.4 与format相结合

将字符串格式设置功能用于字典

使用format_map将两者结合起来

phonebook = {'bob' : 1211, 'tom': 2322}
str1 = "I am bob. My phone is {bob}".format_map(phonebook)
print(str1)
> I am bob. My phone is 1211

1.5 字典常用方法

1.5.1 clear删除所有字典项

就地执行,无返回值

d = {
'name_a':'Gumby', 'age1':42,
'name_b':'bob', 'age2':12,
'name_c':'lily', 'age3':14}
d.clear()
print(d)
> {}

python中的变量赋值,是将变量名指向该地址,对该变量名的字典操作,实际上是对该地址存储的字典进行操作,如:

d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12,
'name_c':'lily', 'age3':14}
x = d
x.clear()
print(x)
print(d)
> {}
> {} # 发现两个字典均被清空

若将x再次赋其他值,对原来的字典没有影响

d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12,
'name_c':'lily', 'age3':14}
x = {}
x.clear()
print(d)
print(x)
>
{'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12, 'name_c': 'lily', 'age3': 14}
{}

1.5.2 copy浅复制与深复制

浅复制

返回一个新字典,与原来的字典完全相同(浅复制)

d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
x = d.copy()
print(d)
print(x)
>
{'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12}
{'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12}

浅复制要分两种情况进行讨论:

1)当浅复制的值是不可变对象(字符串、元组、数值类型)时和“赋值”的情况一样,对象的id值(id()函数用于获取对象的内存地址)与浅复制原来的值相同。

2)当浅复制的值是可变对象(列表、字典、集合)时会产生一个“不是那么独立的对象”存在。有两种情况:

  • 第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。

  • 第二种情况:复制的对象中有复杂子对象(例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。 但是改变原来的值中的复杂子对象的值会影响浅复制的值。

参考:Python中的赋值(复制)、浅拷贝与深拷贝 - 知乎 (zhihu.com)

深复制

模块copy中的deepcopy 可以同时复制值以及包含的所有值

from copy import deepcopy
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
x = deepcopy(d) # 深
y = d.copy() # 浅
x.clear()
print(d)
print(y)

1.5.3 fromkeys 按条件创建字典

创建一个新字典,其中包含指定的键,且每个键对应的值都是None

d = dict.fromkeys(['name','age'])
print(d)
> {'name': None, 'age': None}

若不想使用默认值None 可以提供特定的值

d = dict.fromkeys(['name','age'], 'default')
print(d)
> {'name': 'default', 'age': 'default'}

1.5.4 get 通过键获取值

原来的直接通过键获取对应的值时,可能因为字典中没有该键而报错。

d = dict.fromkeys(['name','age'], 'default')
print(d['weight'])
>
print(d['weight'])
~^^^^^^^^^^
KeyError: 'weight'

而get方法下,寻找不存在的键值时,会返回None(可指定),不会报错

d = dict.fromkeys(['name','age'], 'default')
print(d.get('weight'))
> None

指定失败返回值为 N/A (可用于返回错误信息)

d = dict.fromkeys(['name','age'], 'default')
print(d.get('name', 'N/A'))
> N/A

查找成功,正常返回对应值

d = dict.fromkeys(['name','age'], 'default')
print(d.get('name', 'N/A'))
> default

1.5.5 items 将字典变成列表输出

返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式,顺序不固定

d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
li = d.items()
print(li)
> dict_items([('name_a', 'Gumby'), ('age1', 42), ('name_b', 'bob'), ('age2', 12)])

返回值属于字典视图的特殊类型,特点是不复制,始终是原字典的反映,随原字典改变而改变

d['name_a'] = 'tom' # 修改原字典
print(li)
>
dict_items([('name_a', 'tom'), ('age1', 42), ('name_b', 'bob'), ('age2', 12)])

1.5.6 keys 返回字典的键

返回值为字典视图

d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
li = d.keys()
print(li)
> dict_keys(['name_a', 'age1', 'name_b', 'age2'])

1.5.7 pop获取键对应的值,并删除键值

d = {'name_a' :'Gumby', 'age1':42}
li = d.pop('name_a')
print(li)
print(d)
>
Gumby
{'age1': 42}

1.5.8 popitem “弹出”一组键值对

随机返回一组键值对,并从字典中删去该键值对,与列表中的pop方法类似,只是字典没有最后一位的概念

d = {'name_a' :'Gumby', 'age1':42}
print(d.popitem())
print(d.popitem())
print(d)
>
('age1', 42)
('name_a', 'Gumby')
{}
d = {'name_a' :'Gumby', 'age1':42}
d_len = len(d.items())
print(d_len)
i = 0
while(i < d_len):
print(d.popitem())
i = i + 1
>
2
('age1', 42)
('name_a', 'Gumby')

1.5.9 setdefault 获取指定键值 无则添加

有点像get 但对于找不到指定的键时,会添加指定的键值

d = {}
print(d.setdefault('name', 'None'))
print(d)
>
None
{'name': 'None'}

1.5.10 update 使用A字典的项更新B字典

d1 = {'name': 'bob', 'age': 12}
d2 = {'name': 'tom'}
d1.update(d2)
print(d1)
> {'name': 'tom', 'age': 12}

1.5.11 values 返回字典的值

不同于键的唯一性,values的返回值可能有相同值

d1 = {'name': 'bob', 'age': 60, 'weight': 60}
print(d1.values())
> dict_values(['bob', 60, 60])

返回类型同样为字典视图

python笔记:第四章使用字典的更多相关文章

  1. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  2. Python笔记·第四章—— 细数Python中的数据类型以及他们的方法

    一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...

  3. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  4. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  5. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  6. 《Linux内核分析》读书笔记(四章)

    <Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...

  7. 4 Visual Effects 视觉效果 读书笔记 第四章

    4   Visual Effects    视觉效果        读书笔记 第四章 Well, circles and ovals are good, but how about drawing r ...

  8. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  9. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  10. Python笔记·第六章——字典 (dict) 的增删改查及其他方法

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

随机推荐

  1. Java学习笔记14

    1.Arrays类 ​ Arrays类包含用于操作数组的各种方法(如排序和搜索).该类没有构造函数,直接使用类名.方法名()的方法调用需要的方法. 常用方法 方法 作用 public static S ...

  2. 操作系统实验 & bochs 环境配置

    wsl2 - Ubuntu 22.04 + VSCode + bochs + xfce4 + VcXsrv 笔者环境 wsl2 - Ubuntu 22.04 0. 安装WSL2 & VSCod ...

  3. 第6章. 部署到GithubPages

    依托GitHub Pages 服务,可以把 vuepress 编译后的 博客静态文件 放置到该平台,那么就可以把静态页面发布出来,就会实现了不用购买云服务器就可以发布静态页面的功能. 1. 创建仓库 ...

  4. C++ Primer 5th 阅读笔记:前言

    机器效率和编程效率 Its focus, and that of its programming community, has widened from looking mostly at machi ...

  5. 线上FullGC问题排查实践——手把手教你排查线上问题

    作者:京东科技 韩国凯 一.问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务.正常来说 ...

  6. Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性.比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在. @Da ...

  7. prism journal导航按钮的可用性探索记录

    prism使用导航功能的时候,跳了几个坑,记录一下. 1.导航记录的产生,是在区域导航过程中产生的. _regionManager.Regions[PrismManager.MainViewRegio ...

  8. node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。

    使用 gvm 可以带来以下好处: 快速切换 Golang 版本,方便进行版本测试和开发: 可以在多个项目中同时使用不同版本的 Golang 包和工具,避免冲突: 可以通过 gvm 管理不同版本的 Go ...

  9. 2020-10-16:CAS知道么?底层实现? 会引发什么问题?如何解决ABA问题?

    福哥答案2020-10-16:#福大大架构师每日一题# 简单回答:cmpxchg原子指令.aba,循环开销大,一个共享变量. [知乎](https://www.zhihu.com/question/4 ...

  10. 2022-04-03:k8s安装srs,yaml如何写?

    2022-04-03:k8s安装srs,yaml如何写? 答案2022-04-03: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: la ...