学习python Task 5 字典 笔记

字典

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值