python dict遍历_Python 容器(二):字典(Dict)

f036fff8be3734a754a372e7afdd446b.png

Python 容器(二):字典(Dict)

一、字典

1、定义:Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。

2、特点:

1)字典包含的元素个数不限; 2)值的类型可以是任何数据类型; 3)字典的key必须是不可变的对象,例如整数、字符串、bytes和元组,最常见的还是将字符串作为4)key。列表、字典、集合等就不可以作为key。 5)同时,同一个字典内的key必须是唯一的,但值则不必。 6)从Python3.6开始,字典是有序的。它将保持元素插入时的先后顺序。

2、创建字典

# dict()函数是Python内置的创建字典的方法。
dic = {}    # 创建空字典
# 直接赋值,创建字典
dic = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
# 通过dict()创建字典一
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
# 通过dict()创建字典二
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

3、访问字典

虽然现在3.6版本后的字典在访问时有序了,但字典依然是集合类型,不是序列类型,因此没有索引下标的概念,更没有切片的说法。 但与list类似的地方是,字典采用把相应的键放入方括号内获取对应值的方式取值。

>>> fruit_dic = {'name':'apple', 'color':'red', 'shape':'round', 'taste':'sweet'}
>>> fruit_dic['name']
'apple'
# 如果访问一个不存在的key
>>> >>> fruit_dic['cc']
Traceback (most recent call last):File "<stdin>", line 1, in <module>
KeyError: 'cc'

4、增加和修改

增加就是往字典里插入新的键值对,修改就是给原有的键赋予新的值。由于一个key只能对应一个值,所有,多次对一个可以赋值,后面的值会把前面的值冲掉。

>>> fruit_dic = {'name':'apple', 'color':'red', 'shape':'round', 'taste':'sweet'}
>>> fruit_dic['name']
'apple'
>>> fruit_dic['name'] = 'lemon'
>>> fruit_dic['name']
'lemon'
>>> fruit_dic['name'] = 'banana'
>>> fruit_dic['name'] = 'cherry'
>>> fruit_dic
{'color': 'red', 'taste': 'sweet', 'shape': 'round', 'name':'cherry'}
# 上面字典的顺序出现的不同,是因为使用的是python2.7 。
# 通过for循环来创建(更新)字典
dic = {}
for i in "eafgdgd":dic[i] = ord(i)
print(dic)# {'e': 101, 'a': 97, 'f': 102, 'g': 103, 'd': 100}

5、 删除字典元素、清空字典和删除字典

>>> dic
{'Name': 'Jack', 'Age': '20', 'Class': 'First', 'sex': 'male'}
>>> del dic['Name']     # 删除指定的键
>>> dic
{'Age': '20', 'Class': 'First', 'sex': 'male'}
# ------------------
>>> a = dic.pop('Class')        # 弹出并返回指定的键。必须提供参数!
>>> a
'First'
>>> dic
{'Name': 'Jack', 'Age': 7}
# ------------------
>>> dic.clear()         # 清空字典
>>> dic
{}
# ------------------
>>> del dic         # 删除字典本身
>>> dic
Traceback (most recent call last):File "<pyshell#20>", line 1, in <module>dic
NameError: name 'dic' is not defined

6、字典copy

python字典的copy( )函数返回一个字典的浅复制。 使用方式 dict.copy( )

>>> dict1 = {'Name': 'Jim', 'Age':9}
>>> dict2 = dict1.copy()
>>> dict2
{'Age': 9, 'Name': 'Jim'}

那么直接赋值和copy有什么区别呢?

dict1 =  {'user':'runoob','num':[1,2,3]}dict2 = dict1          # 浅拷贝: 引用对象
dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1)# 输出结果
>>> print(dict1)
{'user': 'root', 'num': [2, 3]}
>>> print(dict2)
{'user': 'root', 'num': [2, 3]}
>>> print(dict3)
{'user': 'runoob', 'num': [2, 3]}

实例中 dict2 其实是 dict1 的引用(别名),所以输出结果都是一致的,dict3 父对象进行了深拷贝,不会随dict1 修改而修改,子对象是浅拷贝所以随 dict1 的修改而修改。 (而且注意python的运算规律)

更多见: Python 直接赋值、浅拷贝和深度拷贝解析

7、字典(Dictionary)的 fromkeys()方法

Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。 语法: dict.fromkeys(seq[, value])

>>> seq = ('Google', 'Runoob', 'Taobao')
>>> dict = dict.fromkeys(seq)
{'Google': None, 'Taobao': None, 'Runoob': None}
>>> dict = dict.fromkeys(seq, 10)
{'Google': 10, 'Taobao': 10, 'Runoob': 10}
# fromkeys()的方法,只能赋唯一值给key。。。
>>> >>> dict = dict.fromkeys(seq,seq)
>>> dict
{'Google': ('Google', 'Runoob', 'Taobao'), 'Taobao': ('Google', 'Runoob', 'Taobao'), 'Runoob': ('Google', 'Runoob', 'Taobao')}

8、get(key)

get(key) # 返回指定键的值,如果键不在字典中,则返回default值

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> dic.get('Name')
'Jack'
# 注意name 不是Name, 所以下面的访问不存在的name,没有报错,但不会显示None
>>> dic.get('name')  
>>> dic['name']
Traceback (most recent call last):File "<stdin>", line 1, in <module>
KeyError: 'name'

9、items( )、keys( )、values( )

items( ) # 以列表返回可遍历的(键, 值) 元组对 keys( ) 以列表返回字典所有的键 values( ) 以列表返回字典所有的值

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> dic.items()
dict_items([('Name', 'Jack'), ('Age', 7), ('Class', 'First')])
>>> dic.values()
dict_values(['Jack', 7, 'First'])
>>> dic.keys()
dict_keys(['Name', 'Age', 'Class'])

10、pop(key) 与popitem( )

pop(key) 删除并返回指定key的值

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> a = dic.pop('Name')
>>> dic
{'Age': 7, 'Class': 'First'}
>>> a
'Jack'

popitem( ) 删除并返回字典的最后一个键值对,不接受参数。

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> dic.popitem('Age')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: popitem() takes no arguments (1 given)
>>> b = dic.popitem()
>>> dic
{'Name': 'Jack', 'Age': 7}
>>> b
('Class', 'First')

11、setdefault(key, default=None)

setdefault(key, default=None) 和get()类似,但如果键不存在于字典中,将会添加键并将值设为default

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> dic.setdefault('id')
>>> dic
{'Name': 'Jack', 'Age': 7, 'Class': 'First', 'id': None}
>>> dic.setdefault('id',10)  # 再次使用,改变不了键'id'的值了。
>>> dic
{'Name': 'Jack', 'Age': 7, 'Class': 'First', 'id': None}
>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> dic.setdefault('id',10)
10
>>> dic
{'Name': 'Jack', 'Age': 7, 'Class': 'First', 'id': 10}

12、update(dict2)

update(dict2) 把字典dict2的键/值对更新到dict里 (在list中使用extend)

>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First', 'id': 10}
>>> seq = {'Google': 10, 'Taobao': 10, 'Runoob': 10}
>>> dic.update(seq)
>>> dic
{'Name': 'Jack', 'Age': 7, 'Class': 'First', 'id': 10, 'Google': 10, 'Taobao': 10, 'Runoob': 10}

13、 遍历字典

从Python3.6开始遍历字典获得的键值对是有序的!

dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}# 1  直接遍历字典获取键,根据键取值
>>> dic = {'Name': 'Jack', 'Age': 7, 'Class': 'First'}
>>> for key in dic:
...     print(key, dic[key])
...
Name Jack
Age 7
Class First# 2  利用items方法获取键值,速度很慢,少用
>>> for key, value in dic.items():
...     print(key,value)
...
Name Jack
Age 7
Class First#3  利用keys方法获取键
>>> for key in dic.keys():
...     print(key, dic[key])
...
Name Jack
Age 7
Class First#4  利用values方法获取值,但无法获取对应的键。
>>> for value in dic.values():
...     print(value)
...
Jack
7
First

14、 利用循环构造字典

# 比较经典的一种用法
>>> dic ={}
>>> for i in 'aefegd':
...     dic[i] = ord(i)
...
>>> dic
{'a': 97, 'e': 101, 'f': 102, 'g': 103, 'd': 100}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奥特曼传奇英雄存档丢了怎么找回_热血传奇:道士最帅武器—玄天

点击“传奇私服玩家群”加个关注☀ 欢迎传奇老司机&#xff01;在这里&#xff0c;分享最新传奇资讯&#xff0c;回忆当年的传奇年代。分享最热传奇手游&#xff0c;端游&#xff0c;找回昔日组队的热血时光。记得加个关注不迷路~☀ 微信公众号&#xff1a;diyisf777热血传奇中…

.Net Core下基于Emit的打造AOP

之前的基于DispatchProxy的AOP组件&#xff0c;实现了属性注入&#xff0c;但是这个依旧有很多限制 比如不支持构造器注入&#xff0c;继承DispatchProxy的子类必须是公开类 个人有点代码洁癖&#xff0c;不喜欢这种不能控制的方式&#xff0c;就学了几天Emit&#xff0c;参考了…

google 确定某点海拔高_“湘能楚天”牌变电站的威宁之旅(一)|高海拔下如何实现与茫茫雪原环境的共生?...

“湘能楚天”牌变电站的威宁之旅——序从湘能楚天办公楼三楼坐电梯&#xff0c;出门左转上京珠高速再转杭瑞高速&#xff0c;根据百度地图的提醒&#xff0c;行车13小时40分&#xff0c;将抵达贵州威宁黑土河&#xff0c;全程1197公里&#xff0c;再前行就到了迤那。黑土河&…

.Net Core 3.0依赖注入替换 Autofac

今天早上&#xff0c;喜庆的更新VS2019&#xff0c;终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入&#xff0c;因为Startup.ConfigureServices不能再把返回值改成IServiceProvider了&#xff0c;原来的替换依赖注入容器就不可行了&#xff0c;我随口说了一下Host上面.Us…

designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水

市政工人揭开井盖排水 楚天快报见习记者吴宜芝 通讯员王艳华城区几处铁路涵洞&#xff0c;曾经是城区内涝重灾区&#xff0c;每逢下雨&#xff0c;涵洞就成了一条无法逾越的鸿沟。然而此次持续6个多小时的降雨中&#xff0c;却均未出现严重的积水&#xff0c;也未影响交通。此次…

a标签点击事件_DOM事件机制

前言本文主要介绍DOM事件级别、DOM事件模型、事件流、事件代理和Event对象常见的应用&#xff0c;希望对你们有些帮助和启发&#xff01;一、DOM事件级别DOM级别一共可以分为四个级别&#xff1a;DOM0级、DOM1级、DOM2级和DOM3级。而DOM事件分为3个级别&#xff1a;DOM 0级事件…

如何开始了解一个新知识(Vuex)

我是歌谣 放弃很容易 但是坚持一定很酷 前言 每次做开发遇到一个新的知识点 总要思索着如何去实现这个新东西 最近来大概讲讲Vuex vuex是前端用的比较多的一个东西之一 通过一张图了解一下原理 原理和vuex产生原因 看完了整个的原理之后 安装就直接过去了 就是包管理工具 …

.Net Core 3.0下AOP试水~~

昨天躺了一下3.0的依赖注入的雷 今天顺势把AOP做了一下调整&#xff0c;比如自动化的AOP注入 默认的Program里面的CreateHostBuilder方法增加一行 public static IHostBuilder CreateHostBuilder(string[] args) >Host.CreateDefaultBuilder(args).UseServiceProviderFactor…

golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布

测试用例是开发人员最后一块遮羞布最近一周写一个比较复杂的业务模块&#xff0c;越写到后面真心越心虚。操作越来越复杂了&#xff0c;代码也逐渐凌乱了起来。比如一个接口&#xff0c;传入的是一个比较复杂的大json&#xff0c;我需要解析这个大json&#xff0c;然后根据json…

android 进度条_Android仿水波纹流球进度条控制器,实现高端大气的主流特效

今天看到一个效果挺不错的&#xff0c;就模仿了下来&#xff0c;加上了一些自己想要的效果&#xff0c;感觉还不错的样子&#xff0c;所以就分享出来了&#xff0c;话不多说&#xff0c;上图CircleView这里主要是实现中心圆以及水波特效package com.lgl.circleview;import andr…

docker php composer 使用_如何使用Docker部署PHP开发环境

本文主要介绍了如何使用Docker构建PHP的开发环境&#xff0c;文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器&#xff0c;各有什么利弊。推荐PHP开发者阅读。希望对大家有所帮助。环境部署一直是一个很大的问题&#xff0c;无论是开发环境还是生产环境&…

from 下拉框多个值提交_Git提交规范

规范的作用大多数情况下&#xff0c;看提交历史的人跟提交代码的人都不是同一个人&#xff0c;当别人阅读你的提交历史时&#xff0c;他很可能是不知道具体代码细节的&#xff0c;你如何在最短的时间内让他一眼知道每次提交的意义&#xff1a;每次提交影响的具体范围&#xff1…

【物联网智能网关-03】GPRS模块中文短信收发

在去年年初&#xff0c;就已经推出V1.0.0的GPRS库&#xff0c;不过在这个版本上只是实现了西文短信收发和字符串方式的GPRS数据通信&#xff0c;功能还相对不完善&#xff08;参见我以前的博文《GPRS通信实现》&#xff09;。最近升级的版本&#xff0c;对以上功能进行了大幅度…

蓄电池单格电压多少伏_蓄电池充电规范手册

很多用户在买完蓄电池之后第一想法就是赶紧充电&#xff0c;很多陋习让用户使用行为造成了新买的蓄电池没怎么用感觉就和旧的没啥区别。而且使用时间越来越短到头来企业还失去了很多的客户&#xff0c;德国阳光蓄电池手册整理整编了在不同的环境中我们该如何很好的去维护自己的…

钉钉机器人关键词应答_除了用于电销,智能语音机器人可以应用哪些地方?

之前的文章探讨的是智能语音机器人在电销行业的应用&#xff0c;然而在实际的场景中&#xff0c;电销行业的应用只是大家所熟知的行业之一。对比于人工电销&#xff0c;使用智能语音机器人有着诸多优势&#xff0c;例如&#xff1a;工作效率高、意向筛选、电话录音并转化为文字…

1-2docker-基本的使用

1、Docker 官⽅提供了⼀个公共的镜像仓库 https://hub.docker.com2、获取镜像 docker pull [选项] [Docker Registry 地址[:端⼝]/]仓库名[:标签]3、运行镜像 docker run -it --rm ubuntu:16.04 /bin/bash -it&#xff1a;这是两个参数&#xff0c;⼀个是 -i&#xff1a;交互式…

assert函数_PHP 之 assert()函数

assert()函数其实是一个断言函数。那么什么是断言呢&#xff1f;百度百科上是这么说的&#xff1a;编写代码时&#xff0c;我们总是会做出一些假设&#xff0c;断言就是用于在代码中捕捉这些假设。说到这里&#xff0c;大家应该能知道assert()函数是干嘛用的了吧&#xff1f;好…

1-3docker commit定制镜像

以定制⼀个 Web 服务器为例⼦1、commit定制镜像 docker pull nginx:1.17运行容器 --name:容器名字 -d&#xff1a;后台 -p本地端口&#xff1a;容器内端口 docker run --name webserver -d -p 8080:80 nginx:1.17#进入容器 docker exec -it webserver /bin/bash#进入容器执…

mysql 启动_mysql安装、启动

在这个网址下载的&#xff1a;Download MySQL Community Server​dev.mysql.com下载后解压到了D盘&#xff0c;我是重命名为mysql。进去目录下bin子目录&#xff0c;进行以下操作&#xff0c;初始化&#xff1a;mysqld --initialize --console执行完成后&#xff0c;会输出 roo…

2010 Stanford Local ACM Programming Contest-H解题报告

题意是说&#xff0c;给出一些道路&#xff0c;要修建一条高速公路&#xff0c;高速公路不能分叉&#xff0c;而且是在给出的图中的一些路径组成&#xff0c;求的是不在高速公路上的点离高速公路的最远距离的最小值是多少。首先要找到一条这个图中的关键路径&#xff0c;既最长…