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. vue高阶函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Nvidia Tensor Core初探

    1 背景 在基于深度学习卷积网络的图像处理领域,作为计算密集型的卷积算子一直都是工程优化的重点,而卷积计算一般转化为矩阵乘运算,所以优化矩阵乘运算自然成为深度学习框架最为关心的优化方向之一.鉴于此,N ...

  3. lnmp中遇到open_basedir配置无效问题

    在使用LNMP包安装PHP时,发现直接修改php.ini的配置是无法生效的,其原因竟然是因为nginx的配置文件,覆盖了php.ini的配置.  ----------------------–  LN ...

  4. UnrealEngine - 网络同步之连接篇

    1 连接过程 - 握手 传统的 C/S 架构下,Client 和 Server 通常会建立一条抽象的 Connection,用来进行两端的通信. UE 的官方文档中提供了 Client 连接到 Ser ...

  5. 2023 年十大 API 管理趋势

    本文探讨了 API 管理在数字化转型中的重要性,以及 API 管理面临的挑战和发展机遇.文章重点介绍了十大 API 管理发展趋势,包括 API 安全性.API 标准化.云端 API 管理解决方案.低代 ...

  6. 记一次 Windows10 内存压缩模块 崩溃分析

    一:背景 1. 讲故事 在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相 ...

  7. Python-tomorrow应用于UI自动化的简单使用

    一.简介 tomorrow属于第三方的一个模块,使用threads方法作为装饰器去修饰一个普通的函数,使其可以达到并发效果.使用起来非常简单. 二.安装 pip install tomorrow 使用 ...

  8. 快速傅里叶变换FFT学习笔记

    点值表示法 我们正常表示一个多项式的方式,形如 \(A(x)=a_0+a_1x+a_2x^2+...+a_nx^n\),这是正常人容易看懂的,但是,我们还有一种表示法. 我们知道,\(n+1\)个点可 ...

  9. 完美的背景图全屏css代码 – background-size:cover?

    写主题样式的时候经常会碰到用背景图铺满整个背景的需求,这里分享下使用方法 需要的效果 图片以背景的形式铺满整个屏幕,不留空白区域 保持图像的纵横比(图片不变形) 图片居中 不出现滚动条 多浏览器支持 ...

  10. 【深入浅出 Yarn 架构与实现】6-4 Container 生命周期源码分析

    本文将深入探讨 AM 向 RM 申请并获得 Container 资源后,在 NM 节点上如何启动和清理 Container.将详细分析整个过程的源码实现. 一.Container 生命周期介绍 Con ...