1.基础知识
当我们需要将一系列至组成数据结构,并通过编号来访问各个值的时候,列表很有用,但可以通过名称来访问各个值,这种数据结构称之为映射(mapping),字典是python中,唯一的内置映射类型,字典中的值不按顺序排列,而是存储在健下。健可能是数字,字符串或者元组。主要原因是健不可修改。
字典,常见的三种用途:
- 表示棋盘的状态,其中每个键都是由坐标组成的元组;
- 存储文件的修改时间,其实健为文件名
- 数字电话和电话簿
# 字典dict 由 健-值 组成,其中健-值 对称之为 项(item).健与值以冒号 : 相连,各个项以逗号 , 分割.整个字典在花括号中.空字典(没有任何项)用两个花括号表示.可以含空格 lst1 = ["China","American"," Russia","European Union","Japan"] lst2 = ["1949","1776","1990","1993","1945"] print(lst2[lst1.index("European Union")]) # index() 检测列表中指定字符串或 值的首次出现的位置索引 print(type(lst2[lst1.index("European Union")])) dict2 = { } print(dict2)
效果如下:
1993 <class 'str'> {}
2.创建和 使用字典
字典dict 由 健-值 组成,其中健-值 对称之为 项(item).健与值以冒号 : 相连,各个项以逗号 , 分割.整个字典在花括号中.空字典(没有任何项)用两个花括号表示.可以含空格
健的类型 key 可以是整数,浮点数(实数) 字符串和元组
自动添加 即便是 字典中 没有的健,也可以给它赋值
成员资格 k in d 查找的不是值,而是健。
lst1 = ["China","American"," Russia","European Union","Japan"] lst2 = ["1949","1776","1990","1993","1945"] items = [("China",1949),("American",1776),(" Russia",1990),("European Union",1993),("Japan",1945)] print(items[1]) print(type(items[1])) # 元组格式 dict1 = dict(items) print(dict1)
元组的基本操作包含以下:
len(d) 返回字典d包含的项 (健-值对)数
d[k]返回与健相关联的值
d[k] = v 将值v 关联到健 k
del d[k] 删除健为k的值
k in d 检查字典d 是否包含健为k 的项
lst3 = [] lst4 = lst3.append(42) print(lst4) dict2 = {} dict2[42]="floor" print(dict2) dict2[41]="floor" print(dict2)
效果如下:
None {42: 'floor'} {41: 'floor', 42: 'floor'}
基本操作如下:items = [("China",1949),("American",1776),(" Russia",1990),("European Union",1993),("Japan",1945)] dict3 =dict(items) print(dict3) print(len(items)) print(len(dict3)) # 返回 字典 dict3的长度,也就是键=对数量 print("*****完美分割线1****** ") str1 =dict3["China"] # 返回 键"China" 的关联的值 print(str1) print("*****完美分割线2****** ") str1 =dict3["Japan"] = 2018 # 将 2018 关联到 键 Japan print(str1) print(dict3) str1 =dict3["Japan"] = "2018" # 将 "2018" 关联到 键 "Japan" print(str1) print(dict3) print("*****完美分割线3****** ") del dict3["Japan"] # 删除键 print(dict3) print("Japan" in dict3) # 成员资格,检查的是 健是否在 print(1949 in dict3) # 成员资格,检查的是 健是否在 ,不是值是否在
效果如下:
{'American': 1776, 'European Union': 1993, 'China': 1949, ' Russia': 1990, 'Japan': 1945} 5 5 *****完美分割线1****** 1949 *****完美分割线2****** 2018 {'American': 1776, 'European Union': 1993, 'China': 1949, ' Russia': 1990, 'Japan': 2018} 2018 {'American': 1776, 'European Union': 1993, 'China': 1949, ' Russia': 1990, 'Japan': '2018'} *****完美分割线3****** {'American': 1776, 'European Union': 1993, 'China': 1949, ' Russia': 1990} False False
将字符串格式设置功能 用于 字典,当字典存储一系列命名的值,可以让格式设置更容易些,即在格式字符串中提取所需的信息,使用fprmat_map来指出 通过一个映射来提供所需的信息。
items = [("China",1949),("American",1776),(" Russia",1990),("European Union",1993),("Japan",1945)] dict4 =dict(items) print(dict4) print("China成立于{China}".format_map(dict4)) # 采用字符串格式化功能 应用 在字典 print(type(dict4["China"])) print("China成立于 %s " % dict4["China"]) # 采用字符串格式化功能 引用 在字典的键-值关联
效果 如下:
{' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': 1945, 'American': 1776} China成立于1949 <class 'int'> China成立于 1949
3. 字典的方法
clear
用于清除字典中全部的键值对儿,调用完该方法后,原字典变成一 个空字典;注意:该方法直接操作原字典,调用后不返回值(或者说直接返回 None )
dict5 = {' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': 1945, 'American': 1776} print(dict5.clear()) dict6 = {' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': 1945, 'American': 1776} dict7 = dict6 print(id(dict6)) print(id(dict7)) dict6 = {} # 重新赋值后,dict6 为空字典,dict7 还指向老字典 print(dict6) print(dict7) print("*****完美分割线3****** ") dict7 = {' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': 1945, 'American': 1776} dict8 = dict7 print(id(dict8)) print(id(dict7)) dict7.clear() # 清空dict6 ,则只有空字典,dict7也空字典 print(dict7) print(dict8) print(id(dict7)) print(id(dict8))
效果如下:
None 1635963034056 1635963034056 {} {'China': 1949, 'European Union': 1993, 'Japan': 1945, ' Russia': 1990, 'American': 1776} *****完美分割线3****** 1635963034184 1635963034184 {} {} 1635963034184 1635963034184
copy
用于创建一个新的字典,用两种复制方法:copy和deepcopy
copy在复制过程中,如果字典中的 值 对象是复杂对象,如列表, 字典等等,则拷贝完后,新的字典中的 值 指向的还是原字典中的 对象,所以修改新对象中的 值 ,同时也是修改原字典中的值,但 是如果字典中的对象是普通类型,如是数字,字符串等,则修改新字 典不会影响原字典。 print("*****完美分割线4****** ") dict9 = {' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': ["2018","2019"], 'American': 1776} dict10 = dict9.copy() dict10['Japan'] = 2018 print(dict10) print(dict9) dict10 = dict9.copy() dict10['Japan'].remove("2018") print(dict10) print(dict9) print("*****完美分割线4****** ") from copy import deepcopy dict9 = {' Russia': 1990, 'China': 1949, 'European Union': 1993, 'Japan': ["2018","2019"], 'American': 1776} dict10 = deepcopy(dict9) dict10['Japan'] = 2018 print(dict10) print(dict9) dict10 = deepcopy(dict9) dict10['Japan'].remove("2018") print(dict10) print(dict9)
- 效果如下:
{'China': 1949, 'European Union': 1993, 'Japan': 2018, ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2018', '2019'], ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2019'], ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2019'], ' Russia': 1990, 'American': 1776} *****完美分割线4****** {'China': 1949, 'European Union': 1993, 'Japan': 2018, ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2018', '2019'], ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2019'], ' Russia': 1990, 'American': 1776} {'China': 1949, 'European Union': 1993, 'Japan': ['2018', '2019'], ' Russia': 1990, 'American': 1776}
fromekeys
用于创建新的字典,其中包含指定的健,默认值为空,或指定为具体一个值
dict10 = dict.fromkeys(["Russia",'China','European Union', 'Japan', 'American']) print(dict10) dict11 = dict.fromkeys(["Russia",'China','European Union', 'Japan', 'American'],"2018") print(dict11)
效果如下:{'European Union': None, 'American': None, 'Japan': None, 'China': None, 'Russia': None} {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'}
get
方法get 提供查找字典的宽松方式,一般而言,dict12['J']索引健关联值,没有会报错,get会返回none 或者指定返回内容。
dict12 ={'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'}
print(dict12['J']) # 查询没有的键,会报错
print(dict12.get('J')) # get() 返回none
print(dict12.get('J',"没有")) # get() 返回 没有
print(dict12.get('American')) # get() 返回2018
效果如下:
None
没有
2018
items
方法 items 返回一个包含所有字典项的列表,其中每个元素为 (key,value)的形式,字典项在列表中的排列顺序不确定。
dict13 = {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'} print(dict13.items()) # items 字典视图 print(list(dict13.items())) # list转化字典视图为列表 print(str(dict13.items())) # str转化字典视图为字符串,失败 print(tuple(dict13.items())) # tuple转化字典视图为大元组 it = dict13.items() print(len(it)) print(it) print(('European Union', '2018') in it) print(('European Union') in dict13) dict13['European Union'] = 'European' print(dict13) print(dict13.items())
效果如下:dict_items([('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('Russia', '2018'), ('American', '2018')]) [('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('Russia', '2018'), ('American', '2018')] dict_items([('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('Russia', '2018'), ('American', '2018')]) (('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('Russia', '2018'), ('American', '2018')) 5 dict_items([('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('Russia', '2018'), ('American', '2018')]) True True {'China': '2018', 'Japan': '2018', 'European Union': 'European', 'Russia': '2018', 'American': '2018'} dict_items([('China', '2018'), ('Japan', '2018'), ('European Union', 'European'), ('Russia', '2018'), ('American', '2018')])
keys pop popitem setdefault update values
dict13 = {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'} items1 = dict13.keys() # 返回字典的键值视图 items2 = dict13.items() # 返回字典的全部视图 print(dict13.keys()) print(dict13.items()) print("*****完美分割线1****** ") it = dict13.pop('Japan') # pop 删除指定的键和值,并返回删除的值 print(it) print(dict13) print("*****完美分割线2****** ") dict14 = {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'} it2 = dict14.popitem() # 随机删除,并返回删除的值 print(dict14) print(it2) print("*****完美分割线3****** ") dict15 = {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2018', 'Russia': '2018'} print(dict15) dict15.setdefault('European Union') # 随机删除,并返回删除的值 print(dict15) dict15.setdefault('European','2018') # setdefault 如果没有找到键值项,将补充进入. print(dict15) print("*****完美分割线4****** ") dict16 = {'European Union': '2018', 'American': '2018', 'Japan': '2018', 'China': '2019', 'Russia': '2019'} dict17 = {'Japan': '2018', 'Russia': '2018', 'China': '2018', 'European Union': '2018', 'American': '2018', 'European': '2018'} print(dict16) dict16.update(dict17) # update 参考dict17 更新 dict16,如果键相同,就替换值. print(dict16) print("*****完美分割线5****** ") dict18 = {'Japan': '2018', 'Russia': '2018', 'China': '2018', 'European Union': '2018', 'American': '2018', 'European': '2018'} print(dict18.values())
效果如下:dict_keys(['Russia', 'China', 'Japan', 'European Union', 'American']) dict_items([('Russia', '2018'), ('China', '2018'), ('Japan', '2018'), ('European Union', '2018'), ('American', '2018')]) *****完美分割线1****** 2018 {'Russia': '2018', 'China': '2018', 'European Union': '2018', 'American': '2018'} *****完美分割线2****** {'China': '2018', 'Japan': '2018', 'European Union': '2018', 'American': '2018'} ('Russia', '2018') *****完美分割线3****** {'Russia': '2018', 'China': '2018', 'Japan': '2018', 'European Union': '2018', 'American': '2018'} {'Russia': '2018', 'China': '2018', 'Japan': '2018', 'European Union': '2018', 'American': '2018'} {'American': '2018', 'Russia': '2018', 'European': '2018', 'China': '2018', 'Japan': '2018', 'European Union': '2018'} *****完美分割线4****** {'Russia': '2019', 'China': '2019', 'Japan': '2018', 'European Union': '2018', 'American': '2018'} {'American': '2018', 'Russia': '2018', 'European Union': '2018', 'European': '2018', 'China': '2018', 'Japan': '2018'} *****完美分割线5****** dict_values(['2018', '2018', '2018', '2018', '2018', '2018'])