一、概要
字典是Python语言中唯一的映射类型。在其他语言里例如在c语言里叫 联合内存 ( associative memories )在JavaScript里 联合数组 ( associative arrays ),在java里就是通常所说的map。
序列是以连续的整数为索引,与此不同的是,字典以 key为索引,key可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为key,如果它直接或间接的包含了可变对象,就不能当做key。不能用列表做关键字,因为列表可以用索引、切割或者
append()
和extend()
等方法改变理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典:
{}
。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式
二、定义字典
- 语法格式
dict1 = {} dict1 = {key1:value1,key2:value2,...}
- 构造方法
dict2 = dict() # 用函数 dict2 = dict(seq)
-
结构图
- 说明
- 用大括号声明
- 键与值用冒号“:”分开;
- 元素与元素用逗号“,”分开;
- 字典键key可以是任意不可变类型,通常是数字、字符串甚至是元组,使用格式一创建的字典的时候key可以不唯一(不唯⼀,取最后⼀个值,不建议这样写),使用格式二创建的时候 key必须唯一
- 值可以是任意类型
- 示例代码
#格式一初始化 user = {'name': 'laowang', 'age': 18, 'sex': '男', 'email': '123@163.com'} #格式二初始化 user =dict({name='laowang', age=18, sex=男, email='123@163.com'}) #值其它复杂类型 user =dict({name=['1',2,'hehe'], age=18, sex=男, email='123@163.com'}) user =dict(address=('北京市','深圳市','武汉市','长沙市'), age=18, sex='男', email='123@163.com') #键不唯一 取最后一个 user = {ame='呵呵',address=('北京市','深圳市','武汉市','长沙市'),address='上海'} user =dict({name='呵呵',address=('北京市','深圳市','武汉市','长沙市',address='上海')}) #错误的写法 print(user.get('address'))
三、获取键值
- 语法格式一
dict[key]
- 方法
dict.get(key, default=None)
- 说明
通过字典的key取值或者get方法 - 参数
- key
字典中要查找的键。 - default
如果指定键的值不存在时,返回该默认值值。
- key
- 返回值
返回指定键的值,如果值不在字典中返回默认值None - 注意事项
通过方式一如果获取不存在的键的值就会触发的一个KeyError异常,
可以使用字典get方法更加安全的获取字典 - 示例代码
user =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)则如果不存在则返回一个默认值,如果设置了则是设置的,否则就是None
In [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存在的时候就是修改的操作
另外一种调用内置方法 - 语法格式
dict[key] = value
- 方法
dict.setdefault(key, value=None)
- 注意
通过setdefault方法只能设置在key不存在的时候才会往字典中添加元素,但如果key已经存在了就不会做任何操作 - 示例代码
In [1]: d = {} In [2]: d['name'] = "python" In [3]: d Out[3]: {'name': 'python'}
In [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}
五、修改
- 语法格式
dict[key] = value
- 方法
dict.update(dict2)
- 说明
当key存在的时候可以通过dict[key] = value方式修改元素 - 参数说明
- dict2
添加到指定字典dict或者可迭代对象到字典中
- dict2
- 示例代码
user= dict() user['name'] = '空空' user['age'] = 18 user[1] = 2 print(user)
user= 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)
六、字典删除
- 语法格式一(不推荐)
del dict[key] #无返回值
- 方法
dict.pop(key[,default])
- 说明
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。如果key不存在直接报错 - 参数
- key:
要删除的键值 - default:
如果key不存在,返回 default 值
- key:
- 返回值
返回被删除的值 - 示例代码
user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com') del user['name'] print(user) #输出 {'address': ('北京市', '深圳市', '武汉市', '长沙市'), 'age': 18, 'sex': '男', 'email': '123@163.com'}
user=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
- 语法格式
dict_keys = dict.keys()
- 说明
获取所有的key - 返回值
以列表返回一个字典所有的键 - 示例代码
user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com') user_keys = user.keys() for user_key in user_keys: print(user_key)
八、遍历所有的value
- 方法
dict_values = dict.values()
- 说明
以列表返回字典中的所有值 - 返回值
返回字典中的所有值 - 示例代码
user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com') dict_values = user.values() for value in dict_values: print(value)
九、遍历所有的key和value
- 方法
dict_items = dict.items()
- 说明
以列表返回可遍历的(键, 值) 元组数组 - 返回值
返回可遍历的(键, 值) 元组数组。 - 注意事项
字典元素的顺序通常没有定义。换句话说,迭代的时候,字典中的键和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如迭代前进行排序 - 示例代码
user = 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')])
user = 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.com
user = 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)
- 练习
编写字典程序:- 用户添加单词和定义
- 查找这些单词
- 如果查不到,请让用户知道
- 循环
dictionary = {} 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为字典所有键对应的初始值。 - 方法
dict.fromkeys(seq[, value])
- 参数
- seq -- 字典键值列表。
- value -- 可选参数, 设置键序列(seq)的值
- 返回值
字典对象 - 举个栗子
li = [1, 2, 3] dict = dict.fromkeys(li) # 带默认值 dict=dict.fromkeys(li,'默认值')
2、popitem
- 说明
方法随机返回并删除字典中的键值对 - 方法
popitem()
- 返回值
键值对的元组形式 - 示例代码
In [1]: dict_num = {'a':1,'b':2,'c':3} In [2]: dict_num.popitem() Out[2]: ('c', 3)
3、copy
- 说明
复制一个字典 - 方法
dict.copy()
- 示例代码
In [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
- 说明
删除字典内所有元素 - 方法
dict.clear()
- 示例代码
In [3]: dict_num = {'a':1,'b':2,'c':3} In [9]: dict_num.clear() In [10]: dict_num Out[10]: {}
十一、字典推导
- 说明
用来快速简洁创建一个新的字典 - 语法格式
dic = {key: value for (key, value) in iterable [if 条件表达式}
- 举个栗子
# 案例1 num_dict= {key: value for i 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':'呵呵' } new_user = { k.lower(): user.get(k.lower(), 0) + user.get(k.upper(), 0 for k in user.keys() }
十二、字典与序列区别
- 存取和访问数据的方式不同。
- 序列类型只用数字类型的键(从序列的开始按数值顺序索引);
- 字典类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,字典类型的键直接或间接地和存储数据值相关联。
- 字典类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
- 字典类型用键直接“映射”到值。
十三、练习
1、实现通讯录功能
- 查询联系人
- 添加联系人
- 更新联系人
- 删除联系人
- 退出程序
2、示例代码
contacts = {} # 定义通讯录
while 1:
temp = input('请输入指令代码:')
if not temp.isdigit():
print("输入的指令错误,请按照提示输入")
continue
item = int(temp) # 转换为数字
if item == 4:
print("|---感谢使用通讯录程序---|")
break
name = input("请输入联系人姓名:")
if item == 1:
if name in contacts:
print(name, ':', contacts[name])
continue
else:
print("该联系人不存在!")
if item == 2:
if name in contacts:
print("您输入的姓名在通讯录中已存在-->>", name, ":", contacts[name])
is_edit = input("是否修改联系人资料(Y/N):")
if is_edit == 'Y':
phone = input("请输入电话号码:")
contacts[name] = phone
print("修改成功")
continue
else:
continue
else:
phone = input("请输入联系人电话:")
contacts[name] = phone
print("添加成功!")
continue
if item == 3:
if name in contacts:
del contacts[name]
print("删除成功!")
continue
else:
print("联系人不存在")