一、概要
字典是Python语言中唯一的映射类型。在其他语言里例如在c语言里叫 联合内存 ( associative memories )在JavaScript里 联合数组 ( associative arrays ),在java里就是通常所说的map。
序列是以连续的整数为索引,与此不同的是,字典以 key为索引,key可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为key,如果它直接或间接的包含了可变对象,就不能当做key。不能用列表做关键字,因为列表可以用索引、切割或者
append()
和extend()
等方法改变
理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典:
{}
。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式
二、定义字典
语法格式
1
2dict1 = {}
dict1 = {key1:value1,key2:value2,...}构造方法
1
2dict2 = dict() # 用函数
dict2 = dict(seq)结构图
说明
- 用大括号声明
- 键与值用冒号“:”分开;
- 元素与元素用逗号“,”分开;
- 字典键key可以是任意不可变类型,通常是数字、字符串甚至是元组,使用格式一创建的字典的时候key可以不唯一(不唯⼀,取最后⼀个值,不建议这样写),使用格式二创建的时候 key必须唯一
- 值可以是任意类型
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13#格式一初始化
user = {'name': 'laowang', 'age': 18, 'sex': '男', 'email': '123@163.com'}
#格式二初始化
user =dict({name='laowang', age=18, sex=男, email='123@163.com'}) #3.6不支持
#值其它复杂类型
user =dict({name=['1',2,'hehe'], age=18, sex=男, email='123@163.com'}) #3.6不支持
user =dict(address=('北京市','深圳市','武汉市','长沙市'), age=18, sex='男', email='123@163.com')
#键不唯一 取最后一个
user = {ame='呵呵',address=('北京市','深圳市','武汉市','长沙市'),address='上海'}
user =dict({name='呵呵',address=('北京市','深圳市','武汉市','长沙市',address='上海')})
#错误的写法
print(user.get('address'))
三、获取键值
语法格式一
1
dict[key]
方法
1
dict.get(key, default=None)
说明
通过字典的key取值或者get方法
参数
key
字典中要查找的键。
default
如果指定键的值不存在时,返回该默认值值。
返回值
返回指定键的值,如果值不在字典中返回默认值None
注意事项
通过方式一如果获取不存在的键的值就会触发的一个KeyError异常,
可以使用字典get方法更加安全的获取字典
示例代码
1
2
3
4
5
6user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
print(user['name'])
print(user['aaa']) #直接抛出异常
print(user.get('address'))#输出元组
print(user.get('aaa')) #输出None
print(user.get('aaa','name'))#dict.get(key, default=None)则如果不存在则返回一个默认值,如果设置了则是设置的,否则就是None1
2
3
4
5
6
7
8
9
10
11In [22]: user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='12 3@163.com')
In [23]: user['name']
Out[23]: '呵呵'
In [24]: user['aaa']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-24-d3b16260a8cd> in <module>()
----> 1 user['aaa']
KeyError: 'aaa'
四、添加
说明
向字典添加元素,添加元素的方式有两种一种是使用,通过dict[键]=值的方式,但当key存在的时候就是修改的操作
另外一种调用内置方法
语法格式
1
dict[key] = value
方法
1
dict.setdefault(key, value=None)
注意
通过setdefault方法只能设置在key不存在的时候才会往字典中添加元素,但如果key已经存在了就不会做任何操作
示例代码
1
2
3
4In [1]: d = {}
In [2]: d['name'] = "python"
In [3]: d
Out[3]: {'name': 'python'}1
2
3
4
5
6
7
8
9
10
11In [4]: d.setdefault('age',18)
Out[4]: 18
In [5]: d
Out[5]: {'name': 'python', 'age': 18}
In [6]: d.setdefault('age',19)
Out[6]: 18
# age 不是19而是是18说明没有设置成功
In [7]: d
Out[7]: {'name': 'python', 'age': 18}
五、修改
语法格式
1
dict[key] = value
方法
1
dict.update(dict2)
说明
当key存在的时候可以通过dict[key] = value方式修改元素
参数说明
dict2
添加到指定字典dict或者可迭代对象到字典中
示例代码
1
2
3
4
5user= dict()
user['name'] = '空空'
user['age'] = 18
user[1] = 2
print(user)1
2
3
4
5
6
7user= dict()
user1=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
user.update(user1)
user.update(phone='110',state=1)#推荐写法
# 或者
user.update({phone:'110',state:1})
print(user)
六、字典删除
语法格式一(不推荐)
1
2del dict[key]
#无返回值方法
1
dict.pop(key[,default])
说明
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。如果key不存在直接报错
参数
key:
要删除的键值
default:
如果key不存在,返回 default 值
返回值
返回被删除的值
示例代码
1
2
3
4
5user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
del user['name']
print(user)
#输出
{'address': ('北京市', '深圳市', '武汉市', '长沙市'), 'age': 18, 'sex': '男', 'email': '123@163.com'}1
2
3
4
5
6
7user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
name = user.pop('name')
print(name) #输出 '呵呵'
key = user.pop('sex','test') #字典存在,返回'男'
print(key) # '男'
key = user.pop('key','111') #字典不存在,返回'111'
print(key)# '111'
七 、遍历所有的key
语法格式
1
dict_keys = dict.keys()
说明
获取所有的key
返回值
以列表返回一个字典所有的键
示例代码
1
2
3
4user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
user_keys = user.keys()
for user_key in user_keys:
print(user_key)
八、遍历所有的value
方法
1
dict_values = dict.values()
说明
以列表返回字典中的所有值
返回值
返回字典中的所有值
示例代码
1
2
3
4user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
dict_values = user.values()
for value in dict_values:
print(value)
九、遍历所有的key和value
方法
1
dict_items = dict.items()
说明
以列表返回可遍历的(键, 值) 元组数组
返回值
返回可遍历的(键, 值) 元组数组。
注意事项
字典元素的顺序通常没有定义。换句话说,迭代的时候,字典中的键和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如迭代前进行排序
示例代码
1
2
3
4
5
6
7user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
user_item = user.items()
print(user_item)
#dict_items([('name', '呵呵'), ('address', ('北京市', '深圳市', '武汉市', '长沙市')), ('age', 18), ('sex', '男'), ('email', '123@163.com')])1
2
3
4
5
6
7
8
9
10user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
user_items = user.items()
for key, value in user_items:
print("%s=" % key, value)
#输出
name= 呵呵
address= ('北京市', '深圳市', '武汉市', '长沙市')
age= 18
sex= 男
email= 123@163.com1
2
3
4
5
6
7user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
user_items = user.items()
keys=[]
values=[]
for key, value in user_items:
keys.append(key)
values.append(value)练习
编写字典程序:
- 用户添加单词和定义
- 查找这些单词
- 如果查不到,请让用户知道
- 循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30dictionary = {}
flag = 'a'
pape = 'a'
off = 'a'
while flag == 'a' or 'c':
flag = input("添加或查找单词 ?(a/c)")
if flag == "a": # 开启
word = input("输入单词(key):")
defintion = input("输入定义值(value):")
dictionary[str(word)] = str(defintion) # 添加字典
print("添加成功!")
pape = input("您是否要查找字典?(a/0)") # read
if pape == 'a':
print(dictionary)
else:
continue
elif flag == 'c':
check_word = input("要查找的单词:") # 检索
for key in sorted(dictionary.keys()): # yes
if str(check_word) == key:
print("该单词存在! ", key, dictionary[key])
break
else: # no
off = 'b'
if off == 'b':
print("抱歉,该值不存在!")
else: # 停止
print("error type")
break
十、其它方法
1、fromkeys
说明
用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
方法
1
dict.fromkeys(seq[, value])
参数
- seq – 字典键值列表。
- value – 可选参数, 设置键序列(seq)的值
返回值
字典对象
举个栗子
1
2
3
4li = [1, 2, 3]
dict = dict.fromkeys(li)
# 带默认值
dict=dict.fromkeys(li,'默认值')
2、popitem
说明
方法随机返回并删除字典中的键值对
方法
1
popitem()
返回值
键值对的元组形式
示例代码
1
2
3In [1]: dict_num = {'a':1,'b':2,'c':3}
In [2]: dict_num.popitem()
Out[2]: ('c', 3)
3、copy
说明
复制一个字典
方法
1
dict.copy()
示例代码
1
2
3
4
5
6
7
8
9
10
11
12In [3]: dict_num = {'a': 1, 'b': 2, 'c': 3}
In [4]: copy_dict= dict_num.copy()
In [5]: copy_dict
Out[5]: {'a': 1, 'b': 2, 'c': 3}
In [8]: id(dict_num)
Out[8]: 4537223856
In [7]: id(copy_dict)
Out[7]: 4537295712
4、clear
说明
删除字典内所有元素
方法
1
dict.clear()
示例代码
1
2
3
4In [3]: dict_num = {'a':1,'b':2,'c':3}
In [9]: dict_num.clear()
In [10]: dict_num
Out[10]: {}
十一、字典推导
说明
用来快速简洁创建一个新的字典
语法格式
1
dic = {key: value for (key, value) in iterable [if 条件表达式}
举个栗子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 案例1
num_dict= {key: str(key) for key in range(10)}
print(num_dict)
# 案例2
fruit = ['apple', 'banana', 'orange']
'''
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),
enumerate将其组成一个索引序列,
利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数,也可指定开始索引
'''
dict_result = {key: value for key, value in enumerate(fruit) if len(value) > 5}
print(dict_result)
# 案例3 合并key的大小写
user = {'Name': '赵丽颖', 'age': 18, 'name': '冯提莫', 'Test': 3, 'test': '呵呵'}
for k in user.keys():
new_user = {k.lower(): str(user.get(k.lower(), 0)) + str(user.get(k.upper(), 0)) for k in user.keys()}
print(new_user)
十二、字典与序列区别
- 存取和访问数据的方式不同。
- 序列类型只用数字类型的键(从序列的开始按数值顺序索引);
- 字典类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,字典类型的键直接或间接地和存储数据值相关联。
- 字典类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
- 字典类型用键直接“映射”到值。
十三、练习
1、实现通讯录功能
- 查询联系人
- 添加联系人
- 更新联系人
- 删除联系人
- 退出程序
2、示例代码
1 | contacts = {} # 定义通讯录 |
1 | dic = {} # 定义通讯录字典 |