07-字典

字典

特点:
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行


1.创建字典

注意:字典的键只能是数字、字符串或者元组 (不能是列表。列表是可变的,不能作为键 ),需要注意的是,同一字典中的各个键必须唯一,不能重复。

1. 1 使用 { } 创建字典

语法格式:dict = { 'key': 'value1', 'key2': 'value2', ... }

key : 键 (唯一和不可变的特性)

value : 值

# 创建空元组
 dict = {}
 print(dict)  # out: {}
 ​
# 使用字符串作为key
 grade = {'数学': 95, '英语': 92, '语文': 84}
 print(grade)  # out: {'数学': 95, '英语': 92, '语文': 84}
 ​
# 使用元组和数字作为key
 dict1 = {(20, 30): 'great', 30: [1, 2, 3]}
 print(dict1)  # out: {(20, 30): 'great', 30: [1, 2, 3]}


1. 2 通过 fromkeys() 方法创建字典

语法格式:dict = dict.fromkeys(list, value=None)

list 参数表示字典中所有键的列表(list)
value 参数表示默认值,如果不写,则为空值 None。

 subject = {'语文', '数学', '英语'}
 grade= dict.fromkeys(subject, 60)
 print(grade)  # out: {'语文': 60, '英语': 60, '数学': 60}


1. 3 通过 dict() 映射函数创建字典
'''str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号。'''
 a = dict(str1=value1, str2=value2, str3=value3)
 # 创建空字典
 d = dict()
 print(d)  # out: {}


'''②向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。'''
 # 方式1 列表套元组
 demo = [('two', 2), ('one', 1), ('three', 3)]  
 # 方式2 列表套列表
 demo = [['two', 2], ['one', 1], ['three', 3]]
 # 方式3 元组套元组
 demo = (('two', 2), ('one', 1), ('three', 3))
 # 方式4 元组套列表
 demo = (['two', 2], ['one', 1], ['three', 3])
 a = dict(demo)
 print(a)  # out: {'two': 2, 'one': 1, 'three': 3}


'''③通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。'''
 keys = ['one', 'two', 'three']  # 还可以是字符串或元组
 values = [1, 2, 3]  # 还可以是字符串或元组
 a = dict( zip(keys, values) )


2.访问字典

2. 1 通过键来访问对应的值

语法格式:dict_name[key]

dict_name : 表示字典变量的名字
key : 表示键名
注意,键必须是存在的,否则会抛出异常。

 tup = (['two', 26],  ['one', 88],  ['three', 100],  ['four', -59])
 dic = dict(tup)
 print(dic['one'])  # 键存在, 88
 print(dic['five'])  # 键不存在,报错


2. 2 通过get()方法获取

语法格式:dict_name.get( '键名' )

 a = dict(two=0.65, one=88, three=100, four=-59)
 print( a.get('one') )  # out: 88
 ​
 '''当键不存在时,get()返回空值None,如果想明确地提示用户该键不存在,那么可以手动设置 get()的第二个参数'''
 a = dict(two=0.65, one=88, three=100, four=-59)
 print( a.get('five',  '该键不存在') )  # out: 该键不存在


3.删除操作

语法格式:del dict_name

 '''删除字典'''
 a = dict(two=0.65, one=88, three=100, four=-59)
 print(a)  # out: {'two': 0.65, 'one': 88, 'three': 100, 'four': -59}
 del a
 print(a)  # 报错, 字典a已经被删除了
 ​
 ​
 '''删除字典中的键值对'''
 a = {'数学': 95, '语文': 89, '英语': 90}
 del a['语文']
 del a['数学']
 print(a)  # out: {'英语': 90}


4. 修改操作

语法格式:dict_name[key] = value

 a = {'数学':95}
 print(a)  # out: {'数学': 95}
 # 添加新键值对
 a['语文'] = 89
 print(a)  # out: {'数学': 95, '语文': 89}
 # 再次添加新键值对
 a['英语'] = 90
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90}
 ​
 ​
 '''字典中键(key)的名字不能被修改,我们只能修改值(value)'''
 a = {'数学': 95, '语文': 89, '英语': 90}
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90}
 a['语文'] = 100
 print(a)  # out: {'数学': 95, '语文': 100, '英语': 90}
 # 可以看到,字典中没有再添加一个{'语文': 100}键值对,而是对原有键值对{'语文': 89}中的 value 做了修改。


5. 常用方法

5. 1 keys()、values() 和 items() 方法
  • keys() 方法用于返回字典中的所有键(key);

  • values() 方法用于返回字典中所有键对应的值(value);

  • items() 方法用于返回字典中所有的键值对(key-value)。

 scores = {'数学': 95, '语文': 89, '英语': 90}
 print(scores.keys())  # out: dict_keys(['数学', '语文', '英语'])
 print(scores.values())  # out: dict_values([95, 89, 90])
 print(scores.items())  # out: dict_items([('数学', 95), ('语文', 89), ('英语', 90)])

在 Python 2.x 中,上面三个方法的返回值都是列表(list)类型。但在 Python 3.x 中,它们的返回值并不是我们常见的列表或者元组类型,因为 Python 3.x 不希望用户直接操作这几个方法的返回值。

在 Python 3.x 中如果想使用这三个方法返回的数据,一般有下面两种方案:

  1. 使用 list() 函数,将它们返回的数据转换成列表,例如:
 a = {'数学': 95, '语文': 89, '英语': 90}
 b = list(a.keys())
 print(b)  # out: ['数学', '语文', '英语']
  1. 使用 for in 循环遍历它们的返回值,例如:
 a = {'数学': 95, '语文': 89, '英语': 90}
 for k in a.keys():
 print(k,end=' ')
 print("\n---------------")
 for v in a.values():
 print(v,end=' ')
 print("\n---------------")
 for k,v in a.items():
 print("key:",k," value:",v)

'''运行结果为:

    数学 语文 英语  
    ---------------  
    95 89 90  
    ---------------  
    key: 数学 value: 95  
    key: 语文 value: 89  
    key: 英语 value: 90

'''


5. 2 copy() 方法

作用:返回一个字典的拷贝,也即返回一个具有相同键值对的新字典

语法格式:dict_name.copy()

 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
 b = a.copy()
 print(b)  # out: {'one': 1, 'two': 2, 'three': [1, 2, 3]}

可以看到,copy() 方法将字典 a 的数据全部拷贝给了字典 b。

注意:copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy() 方法只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {'one': 1, 'two': 2, 'three': []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。

 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
 b = a.copy()

# 向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
 a['four']=100
 print(a)  # out: {'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
 print(b)  # out: {'one': 1, 'two': 2, 'three': [1, 2, 3]}

# 由于 b 和 a 共享[1,2,3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
 a['three'].remove(1)
 print(a)  # out: {'one': 1, 'two': 2, 'three': [2, 3], 'four': 100} 
 print(b)  # out: {'one': 1, 'two': 2, 'three': [2, 3]}

从运行结果不难看出,对 a 增加新键值对,b 不变;而修改 a 某键值对中列表内的元素,b也会相应改变。


5. 3 update() 方法

作用:使用一个字典所包含的键值对来更新己有的字典。

在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

语法格式:dict_name.update()

 a = {'one': 1, 'two': 2, 'three': 3}
 a.update({'one':4.5, 'four': 9.3})
 print(a)  # out: {'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}


5. 4 pop() 和 popitem() 方法

作用:pop() 和 popitem() 都用来删除字典中的键值对,不同的是,pop() 用来删除指定的键值对,而 popitem() 用来随机删除一个键值对。

语法格式:dict_name.pop(key) , dict_name.popitem()

 a = {'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}
 print(a)
 a.pop('化学')
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90, '生物': 98, '物理': 89}
 a.popitem()
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90, '生物': 98}

对 popitem() 的说明

其实,说 popitem() 随机删除字典中的一个键值对是不准确的,虽然字典是一种无须的列表,但键值对在底层也是有存储顺序的,popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作。


5. 5 setdefault() 方法

作用:用来返回某个 key 对应的 value

语法格式:dict_name.setdefault(key, defaultvalue)

dictname 表示字典名称,key 表示键,defaultvalue 表示默认值(可以不写,不写的话是 None)。

当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。

也就是说,setdefault() 方法总能返回指定 key 对应的 value:

如果该 key 存在,那么直接返回该 key 对应的 value;
如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。

 a = {'数学': 95, '语文': 89, '英语': 90}
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90} 

# key不存在,指定默认值
 a.setdefault('物理', 94)
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90, '物理': 94}

# key不存在,不指定默认值
 a.setdefault('化学')
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90, '物理': 94, '化学': None}

# key存在,指定默认值
 a.setdefault('数学', 100)
 print(a)  # out: {'数学': 95, '语文': 89, '英语': 90, '物理': 94, '化学': None}
5. 5 clear() 方法

作用:清除字典中的所有项,无返回值

语法格式:dict_name.clear()

 a = {'数学': 95, '语文': 89, '英语': 90}
 a.clear()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353