字典(dict)
字典是 python 中唯一的映射类型,是一个无序的“键:值”对集合,每一个元素都是 pair,包含 key、value两部分。 key 是 Integer 或 string 类型,value 是任意类型,即{ key: value}
- 字典的定义
关键字(key)必须使用不可变类型,在同一个字典中,关键字必须互不相同
# 字典是一个无序的数据集合,使用print输出字典时
# 通常输出的顺序和定义的顺序不一致
>>> s = {}
>>> print(type(s))
<class 'dict'>
# 字典:key-value 键值对
# value值可以是任意数据类型
代码:
s = {
'linux':[100,99,88],
'westos':[190,564,645]
}
print(s)
print(type(s))
运行结果:
{'linux': [100, 99, 88], 'westos': [190, 564, 645]}
<class 'dict'>
# 工厂函数
代码:
d = dict()
print(d)
print(type(d))
d1 = dict(a=1,b=2)
print(d1)
print(type(d1))
运行结果:
{}
<class 'dict'>
{'a': 1, 'b': 2}
<class 'dict'>
# 字典的嵌套
students = {
'03113009':{
'name':'tom',
'age':18,
'score':80
},
'03113010':{
'name': 'laoli',
'age': 19,
'score':30
}
}
print(students['03113010']['name'])
#所有的key和value值是一样的情况
print({}.fromkeys({'1','2'},'03113009'))
运行结果:
laoli
{'1': '03113009', '2': '03113009'}
- 字典的特性
# 成员操作符
>>> d = {
... '1':'a',
... '2':'b'
... }
>>> print('1' in d)
True
>>> print('1' not in d)
False
# for循环,默认遍历字典的key值
>>> for key in d:
... print(key)
...
1
2
#遍历字典
>>> for key in d:
... print(key,d[key])
...
1 a
2 b
>>> for key,value in d.items():
... print(key,value)
...
1 a
2 b
- 字典的增加与修改
>>> service = {
... 'http':80,
... 'ftp':21,
... 'ssh':22
... }
# 增加一个元素
# 如果key值存在,则更新对应的value值
# 如果key值不存在,则添加对应的key-value值
>>> service['mysql'] = 3306
>>> print(service)
{'http': 80, 'ftp': 21, 'ssh': 22, 'mysql': 3306}
>>> service['http'] = 443
>>> print(service)
{'http': 443, 'ftp': 21, 'ssh': 22, 'mysql': 3306}
# 添加多个key-value值
>>> service_backup = {
... 'https':443,
... 'tomcat':8080,
... 'http':8080
... }
>>> service.update(service_backup)
>>> print(service)
{'http': 8080, 'ftp': 21, 'ssh': 22, 'mysql': 3306, 'https': 443, 'tomcat': 8080}
>>> service.update(flask=9000,http=8000)
>>> print(service)
{'http': 8000, 'ftp': 21, 'ssh': 22, 'mysql': 3306, 'https': 443, 'tomcat': 8080, 'flask': 9000}
# setdefault添加key值
# 如果key值存在,不做修改
# 如果key值不存在,则添加对应的key-value
>>> service.setdefault('http',9090)
8000
>>> print(service)
{'http': 8000, 'ftp': 21, 'ssh': 22, 'mysql': 3306, 'https': 443, 'tomcat': 8080, 'flask': 9000}
>>> service.setdefault('oracle',44575)
44575
>>> print(service)
{'http': 8000, 'ftp': 21, 'ssh': 22, 'mysql': 3306, 'https': 443, 'tomcat': 8080, 'flask': 9000, 'oracle': 44575}
- 字典的查看与修改
>>> service = {
... 'http':80,
... 'ftp':21,
... 'ssh':22
... }
# 查看字典的key值
>>> print(service.keys())
dict_keys(['http', 'ftp', 'ssh'])
# 查看字典的value值
>>> print(service.values())
dict_values([80, 21, 22])
# 查看key的value值;key不存在,报错
>>> print(service['https'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'https'
#查看key的value值
#key不存在,默认返回None
#key不存在,有default,则返回default
>>> print(service.get('https',443))
443
>>> print(service.get('https'))
None
# 遍历
>>> for k,v in service.items():
... print(k,'--->',v)
...
http ---> 80
ftp ---> 21
ssh ---> 22
>>> print(service['https'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'https'
>>> if 'https' in service:
... print(service['https'])
... else:
... print('key not exist')
...
key not exist
#get方法获取指定key对应的value值
#如果key值存在,返回对应的value值
#如果key值不存在,默认返回None,如果需要指定返回值,传值即可
>>> print(service.get('https','ket not exist'))
ket not exist
- 字典的删除
>>> service = {
... 'http':80,
... 'ftp':21,
... 'ssh':22
... }
>>> del service['http']
>>> print(service)
{'ftp': 21, 'ssh': 22}
# pop删除指定key的key-value
# 如果key存在,删除,并且返回删除key对应的value
# 如果key不存在,报错
>>> service = {
... 'http':80,
... 'ftp':21,
... 'ssh':22
... }
>>> item = service.pop('http')
>>> print(item)
80
>>> print(service)
{'ftp': 21, 'ssh': 22}
>>> item = service.pop('linux')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'linux'
#popitem删除最后一个key-value值
>>> service = {
... 'http':80,
... 'ftp':21,
... 'ssh':22
... }
>>> item = service.popitem()
>>> print('删除的key-value对是:',item)
删除的key-value对是: ('ssh', 22)
>>> print(service)
{'http': 80, 'ftp': 21}
#清空字典内容
>>> service.clear()
>>> print(service)
{}
- 字典内置get方法
get方法获取指定key对应的value值
如果key值存在,返回对应的value值
如果key值不存在,默认返回None,如果需要指定返回值,传值即可
>>> info = {'1':'first','2':'second','3':'third'}
>>>print(info.get(input('input type you number:'),'别逗,你输错了!')) # 指定key不存在时的返回值
input type you number:5
别逗,你输错了
- 内置方法fromkeys
字典中的 key 有相同的 value 值,默认为 None
>>>dic.fromkeys([1,2,3,5])
{1: None, 2: None, 3: None, 5: None}
>>>dic.fromkeys(['redhat','westos','python'],'hello')
{'redhat': 'hello', 'westos': 'hello', 'python': 'hello'}
- 字典的排序
使用字典进行数据信息统计时,字典是无序的,则打印输出的字典内容也是无序的,python中字典的排序分为按键 key 排序 和 按值 value 排序,使用内置函数 sorted()
# 1. 按 ‘值(value)’ 排序
>>> dic = {'班级': 1, 'age': 9, 'score': 10}
>>>sorted(dic.items(), key=lambda e:e[1], reverse=True)
[('score', 10), ('age', 9), ('班级', 1)] # ASCII码降序,此处按数值降序
>>>
# 其中 e 表示 dic.items()中的一个元素,e[1]则表示按值排序,reverse=True 表示降序排列
# 2. 按 ‘键(key)’ 排序
>>>sorted(dic.items(), key=lambda e:e[0], reverse=True)
[('班级', 1), ('score', 10), ('age', 9)] # ASCII码降序
==说明: ==字典的.items()函数返回的是一个列表,列表的每一个元素都是一个键和值组成的元组,所以该sorted(…)返回的同样是由元组组成的列表,lambda 函数后面介绍
练习
- 数字重复统计
数字重复统计:
1)随机生成1000个整数;
2)数字范围[20,100];
3)升序输出所有不同的数字及其每个数字重复的次数
import random
all_nums = []
for item in range(1000):
all_nums.append(random.randint(20,100))
#对生成的1000个数进行排序,然后加到字典中
sorted_nums = sorted(all_nums)
num_dict = {}
for num in sorted_nums:
if num in num_dict:
num_dict[num] += 1
else:
num_dict[num] = 1
print(num_dict)
- 重复的单词统计
重复的单词: 此处认为单词之间以空格为分隔符, 并且不包含,和.;
# 1. 用户输入一句英文句子;
# 2. 打印出每个单词及其重复的次数;
"hello java hello python"
# hello 2
# java 1
# python 1
d = {}
s = input('请输入一段英文句子:')
s1 = s.split(' ')
for i in s1:
if i in d:
d[i] += 1
else:
d[i] = 1
print(d)
- 随机生成卡号
# 1. 随机生成100个卡号;
# 卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100>),
# 2. 生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat";
# 3. 输出卡号和密码信息, 格式如下:
卡号 密码
6102009001 000000
# 1. 随机生成100个卡号;
# 卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100>),
# 2. 生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat";
# 3. 输出卡号和密码信息, 格式如下:
卡号 密码
6102009001 000000