字典
python中唯一的映射类型,其索引为关键字,键必须互不相同,可以是任意不可变类型,通常为字符串或数值。
使用id(x)
函数对x进行某种操作后,与不做操作对比,可以查看x是否是可变类型,如果两者一样,则是可变类型;或者hash(x)
只要不报错,证明x可以被哈希,即不可变。
数值,字符,元组,都是不可变类型,可被hash;
列表,集合,字典,都是可变类型。
字典操作:
(1)创建:
字典查找插入速度极快,但内存占用大。{元素1, 元素2, ... , 元素n}
,每个元素都是键值对(key:value)
。
直接通过字符串或数值作为key创建;
通过元组作为作为key创建;
通过dict()创建,dic=dict() # 空字典
;
通过key索引,将数据直接放入字典中,key和value唯一对应;
通过 dict(mapping) 创建;
# 一个列表里三个元组
dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1) # {'cherry': 4098, 'apple': 4139, 'peach': 4127}
# 一个元组里三个元组
dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2) # {'peach': 4127, 'cherry': 4098, 'apple': 4139}
通过 dict(**kwargs) 创建,但此方法中键只能是字符串,且字符串不能加引号。
dic = dict(name='Tom', age=10) # name和age为键,不加引号
print(dic) # {'name': 'Tom', 'age': 10}
print(type(dic)) # <class 'dict'>
(2)方法:
1):dict.fromkeys()
dict.fromkeys(seq[, value])
用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。value可以是一个数值,元组等,也可以省略。
2):dict.keys()
dict.keys()
返回一个可迭代对象,包含dict中全部 key 。可以使用 list() 来转换为列表,列表为字典中的所有键。
3):dict.values()
dict.values()
返回一个可迭代对象,包含dict中全部 value 。可以使用 list() 来转换为列表,列表为字典中的所有键。
4):dict.items()
dict.items()
以列表返回可遍历的 (键, 值) 元组数组。列表内全是元组。
5):dict.get(key, default=None)
dict.get(key, default=None)
返回指定键的值,如果值不在字典中返回默认值。
6):dict.setdefault(key, default=None)
dict.setdefault(key, default=None)
和get()
方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
7):key in dict
key in dict
in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true。
8):删除
dict.pop(key[,default])
删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值(此时pop必须设置默认值)。
del dict[key]
删除字典给定键 key 所对应的值。
dict.popitem()
随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
dict.clear()
用于删除字典内所有元素。
9):dict.copy()
dict.copy()
返回一个字典的浅复制。
dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
dic2 = dic1.copy()
print("dic2")
# {'Age': 7, 'Name': 'Lsgogroup', 'Class': 'First'}
直接赋值和copy的区别:
dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}
# 引用对象
dic2 = dic1
# 浅拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()
print(id(dic1)) # 148635574728
print(id(dic2)) # 148635574728
print(id(dic3)) # 148635574344
# 修改 data 数据
dic1['user'] = 'root'
dic1['num'].remove(1)
# 输出结果
print(dic1) # {'user': 'root', 'num': [2, 3]}
print(dic2) # {'user': 'root', 'num': [2, 3]}
print(dic3) # {'user': 'runoob', 'num': [2, 3]}
10):dict.update()
dict.update(dict2)
把字典参数 dict2 的键值对更新到字典 dict 里。dic 中的键值对保留,但是相同的键对应的值会被更新。
练习:
1、字典基本操作
字典内容如下: dic = {'python': 95,'java': 99,'c': 100}
用程序解答下面的题目:
字典的长度是多少
请修改’java’ 这个key对应的value值为98
删除 c 这个key
增加一个key-value对,key值为 php, value是90
获取所有的key值,存储在列表里
获取所有的value值,存储在列表里
判断 javascript 是否在字典中
获得字典里所有value 的和
获取字典里最大的value
获取字典里最小的value
字典 dic1 = {‘php’: 97}, 将dic1的数据更新到dic中
dic = {'python': 95, 'java': 99, 'c': 100}
print(len(dic))
dic['java'] = 98
print(dic)
del dic['c']
print(dic)
dic.setdefault('php', 90)
print(dic)
lst1 = list(dic.keys())
print(lst1)
lst2 = list(dic.values())
print(lst2)
print('javascript' in dic)
print(sum(lst2))
print(max(lst2))
print(min(lst2))
dic1 = {'php': 97}
dic.update(dic1)
print(dic)
2、字典中的value
有一个字典,保存的是学生各个编程语言的成绩,内容如下
data = {
'python': {'上学期': '90', '下学期': '95'},
'c++': ['95', '96', '97'],
'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
}
各门课程的考试成绩存储方式并不相同,有的用字典,有的用列表,但是分数都是字符串类型,请实现函数transfer_score(score_dict),将分数修改成int类型。
data1 = {
'python': {'上学期': '90', '下学期': '95'},
'c++': ['95', '96', '97'],
'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
}
def transfer_score(data):
dic = {}
listk = list(data.keys())
listv = list(data.values())
for i in range(len(listk)):
if type(listv[i]) == list:
for j in range(len(listv[i])):
if type(listv[i][j]) == list:
for k in range(len(listv[i][j])):
listv[i][j][k] = int(listv[i][j][k])
if type(listv[i][j]) == dict:
dic1 = listv[i][j]
dic2 = {}
dic1k = list(dic1.keys())
dic1v = list(dic1.values())
for p in range(len(dic1v)):
dic1v[p] = int(dic1v[p])
for q in range(len(dic1k)):
dic2[dic1k[q]] = dic1v[q]
listv[i][j] = dic2
if type(listv[i][j]) == str:
listv[i][j] = int(listv[i][j])
if type(listv[i]) == dict:
dic1 = listv[i]
dic2 = {}
dic1k = list(dic1.keys())
dic1v = list(dic1.values())
for p in range(len(dic1v)):
dic1v[p] = int(dic1v[p])
for q in range(len(dic1k)):
dic2[dic1k[q]] = dic1v[q]
listv[i] = dic2
for m in range(len(listk)):
dic[listk[m]] = listv[m]
return dic
dd = transfer_score(data1)
print(dd)