Python内置数据结构之字典dict
1. 字典
字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数(整数索引)、字符串或元组。字典(日常生活中的字典和Python字典)旨在让你能够轻松地找到特定的单词(键),以获悉其定义(值)。
字典用{}括起开。
在很多情况下,使用字典都比使用列表更合适。下面是Python字典的一些用途:
表示棋盘的状态,其中每个键都是由坐标组成的元组;
存储文件修改时间,其中的键为文件名;
数字电话/地址簿。
1.1 函数 dict
可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。函数dict实际上是一个类,也是一个工厂函数,目前,这种差别不重要。
这可能是函数dict最常见的用法,但也可使用一个映射实参来调用它,这将创建一个字典,其中包含指定映射中的所有项。像函数list、 tuple和str一样,如果调用这个函数时没有提供任何实参,将返回一个空字典。从映射创建字典时,如果该映射也是字典(毕竟字典是Python中唯一的内置映射类型),可不使用函数dict,而是使用字典方法copy。
>>> items = [('name', 'Alex'), ('age', 22)]
>>> d = dict(items)
>>> d
{'name': 'Alex', 'age': 22}
>>> d['name']
'Alex'
>>>
还可使用关键字实参来调用这个函数,如下所示:
>>> d = dict(name='alex', age=22)
>>> d
{'name': 'alex', 'age': 22}
>>>
1.2 创建和使用字典
字典以类似于下面的方式表示:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
字典由键及其相应的值组成,这种键-值对称为项(item)。在前面的示例中,键为名字,而值为电话号码。每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,而整个字典放在花括号内。空字典(没有任何项)用两个花括号表示,类似于下面这样: {}。
注意:在字典(以及其他映射类型)中,键必须是独一无二的,而字典中的值无需如此。
基本的字典操作
a. 字典的基本行为在很多方面都类似于序列。
i. len(d)返回字典d包含的项(键-值对)数。
ii. d[k]返回与键k相关联的值。
iii. d[k] = v将值v关联到键k。
iv. del d[k]删除键为k的项。
v. k in d检查字典d是否包含键为k的项。
b. 字典和列表一些重要的不同之处
i. 键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变的类型,如浮点数(实数)、字符串或元组。
ii. 自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不使用append或其他类似的方法,就不能给列表中没有的元素赋值。
iii. 成员资格:表达式k in d(其中d是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易。
提示:相比于检查列表是否包含指定的值,检查字典是否包含指定的键的效率更高。数据结构越大,效率差距就越大。
1.3 字典的常用操作
info = {
'stu101': "TengLan Wu",
'stu102': "longZe Luola",
'stu103': "XiaoZe Maliya"
}
# print(info["stu101"])
# add
print(info)
info["stu101"] = "武藤兰" # 修改
info["stu104"] = "Cangjingkong" # 不存在,创建
print(info)
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
{'stu101': '武藤兰', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya', 'stu104': 'Cangjingkong'}
# del
print(info)
info.pop("stu101") # 如果不指定,随机删
# del info["stu101"]
# info.popitem() # 随机删
print(info)
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
{'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
# find
print(info)
print(info.get("stu104"))
# Determine whether the dictionary has data
print('stu104' in info) # info.has_key("103") in py2.x
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
None
False
# 分别打印values keys
print(info)
print(info.values())
print(info.keys())
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
dict_values(['TengLan Wu', 'longZe Luola', 'XiaoZe Maliya'])
dict_keys(['stu101', 'stu102', 'stu103'])
# setdefault 在字典中取值,取到,将stu103返回,取不到stu106,创建
print(info)
print(info.setdefault("stu103", "Alex"))
print(info)
print(info.setdefault("stu106", "Alex"))
print(info)
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
XiaoZe Maliya
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
Alex
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya', 'stu106': 'Alex'}
# update 字典合并,原有且更改的,更新;原没有的,增加
print(info)
print(info)
b = {
"stu101": "Daqiao",
1: 3,
2: 4
}
info.update(b)
print(info)
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
{'stu101': 'Daqiao', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya', 1: 3, 2: 4}
# items 将字典转化成列表
print(info)
print(info.items())
——>
{'stu101': 'TengLan Wu', 'stu102': 'longZe Luola', 'stu103': 'XiaoZe Maliya'}
dict_items([('stu101', 'TengLan Wu'), ('stu102', 'longZe Luola'), ('stu103', 'XiaoZe Maliya')])
# 高效 通过索引,直接取出info
print(info)
for i in info:
print(i, info[i])
print("----------")
# 低效 将字典转成列表(数据量很大时,转很长时间,机器奔溃) 列表中每一个元素都是一个小元组
for k, v in info.items():
print(k, v)
# fromkeys [1, {"name": "alex"}, 444] 共用一个地址空间,类似浅copy
c = dict.fromkeys([6, 7, 8], "test")
c2 = dict.fromkeys([6, 7, 8], [1, {"name": "alex"}, 444])
print(c)
print(c2)
c2[7][1]['name'] = "jack"
print(c2)
——>
{6: 'test', 7: 'test', 8: 'test'}
{6: [1, {'name': 'alex'}, 444], 7: [1, {'name': 'alex'}, 444], 8: [1, {'name': 'alex'}, 444]}
{6: [1, {'name': 'jack'}, 444], 7: [1, {'name': 'jack'}, 444], 8: [1, {'name': 'jack'}, 444]}
# copy
返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换) ,原件也将发生变化,因为原件指向的也是被修改的值(如这个示例中的'machines'列表所示)。
# deepcopy
为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块copy中的函数deepcopy。
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Alfred', 'Bertrand']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'names': ['Alfred', 'Bertrand']}
字典方法示例
# 一个使用get()的简单数据库
# 一个将人名用作键的字典。每个人都用一个字典表示,
# 字典包含键'phone'和'addr',它们分别与电话号码和地址相关联
people = {
'Alice': {
'phone': '',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '',
'addr': 'Baz avenue 90'
}
}
# 电话号码和地址的描述性标签,供打印输出时使用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name: ')
# 要查找电话号码还是地址?
request = input('Phone number (p) or address (a)? ')
# 使用正确的键:
key = request # 如果request既不是'p'也不是'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# 使用get提供默认值
person = people.get(name, {})
label = labels.get(key, key)
result = person.get(key, 'not available')
print("{}'s {} is {}.".format(name, label, result)) 执行结果:
Name: jj
Phone number (p) or address (a)? a
jj's address is not available.
Python内置数据结构之字典dict的更多相关文章
- 【Redis源代码剖析】 - Redis内置数据结构之字典dict
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51018337 今天我们来讲讲Redis中的哈希表. 哈希表在C++中相应的是ma ...
- Python内置数据结构之列表list
1. Python的数据类型简介 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). Python内 ...
- python内置数据结构
数据类型: 数值型 int float complex bool 序列对象 字符串 str 列表 list 元组 tuple 键值对 集合 set 字典dict 数值型: int.float.comp ...
- Python内置数据结构--列表
本节内容: 列表 元组 字符串 集合 字典 本节先介绍列表. 一.列表 一种容器类型.列表可以包含任何种类的对象,比如说数字.子串.嵌套其他列表.嵌套元组. 任意对象的有序集合,通过索引访问其中的元素 ...
- Python内置数据结构之字符串str
1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...
- python内置数据结构方法的时间复杂度
转载自:http://www.orangecube.net/python-time-complexity 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了P ...
- [PY3]——内置数据结构(7)——字典及其常用操作
字典及其常用操作Xmind图 关于字典 字典是一种key-value结构 字典是无序的 字典的定义 # {}大括号可以直接定义一个空字典 In [1]: d={};type(d) Out[1]: di ...
- Python内置数据结构之元组tuple
1. Python序列之元组:不可修改的序列 元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能像列表式的增删改,只能查,切片,所以元组又叫只读列表. 元组用圆括号括起(这是通常采用的做法) ...
- python 内置数据结构 字符串
字符串 一个个字符组成的有序的序列,是字符的集合 使用单引号,双引号,三引号引住的字符序列 字符串是不可变对象 Python3起,字符串就是Unicode类型 字符串定义 初始化 s1 = 'stri ...
随机推荐
- 04 Django-ORM多表操作(进阶)
一.创建模型 下面我们通过图书管理系统,来设计出每张表之间的对应关系. 通过上图关系,来定义一下我们的模型类. from django.db import models class Book(mo ...
- 对服务器磁盘、CPU、内存使用状态,设置163邮件告警
1,桥接模式可上网,首先你的邮箱已经开通yum -y install mailx dos2unix.x86_64 mailx -V[root@localhost ~]# vim /etc/mail. ...
- HAOI2006 受欢迎的牛 缩点
不难分析出我们就是要求是否有唯一一个出度为0的强连通分量. Code: #include<cstdio> #include<stack> #include<algorit ...
- Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)A. Friends Meeting
Two friends are on the coordinate axis Ox in points with integer coordinates. One of them is in the ...
- UOJ #86 mx的组合数 (数位DP+NTT+原根优化)
题目传送门 matthew99神犇的题解讲得非常清楚明白,跪烂Orzzzzzzzzzzzzz 总结一下,本题有很多重要的突破口 1.Lucas定理 看到n,m特别大但模数特别小时,容易想到$lucas ...
- assound.conf
pcm.!dmix {type dmixipc_key 5678293ipc_key_add_uid yesslave {pcm "hw:0,0"period_time 0peri ...
- JavaScript原生值与JSON的转换
---------------------------------- ---------------------------- stringify方法的另外两种参数: ---------------- ...
- MSMQ如何设置事务特性
- python 并发编程入门
多进程 在Unix/Linux下,为我们提供了类似c中<unistd.h>头文件里的的fork()函数的接口,这个函数位于os模块中,相同与c中类似,对于父进程fork()调用返回子进程I ...
- DOM基础----DOM(一)
DOM(Document Object Model),中文名称为文档对象模型.是处理可扩展标识语言的标准编程接口,主要针对HTML和XML.DOM描绘了一个层次化的节点树,开发者能够加入.改动和移除页 ...