数据类型划分:可变数据类型,不可变数据类型
不可变数据类型 :元祖,bool,int,str,可哈西
可变数据类型:list,dict,set 不可哈西
dict的key:必须是不可变数据类型
dict的value:任意数据类型
dict优点: 二分查找,存储大量关系型数据,
dict特点:在3.5版本之前是无序的,在3.6版本及以后是有序的

dic = {
    'name': ['大飞', '小飞'],
    'py': [{'num': 7,
           'avg_age': 16}],
    True: 1,
    (1, 2, 3): 'jerry',
    2: '二哥',
}

1.字典操作:增添
直接添加:对于已经存在的key会覆盖掉之前的value
setdefault(key, value ):若已经存在了key不会覆盖之前的value

dic1 = {"name": "jerry", "age": 18, "sex": "male", }
dic1["high"] = 185                       # 没有的key增加
dic1["age"] = 16                         # 已有的key覆盖
dic1.setdefault("weight", 100)           # 没写value默认为None
dic1.setdefault("age", 20)               # 若已经存在key不做覆盖
print(dic1)

2.字典操作:删除
pop(key, 自定义返回值):会返回删除的value值,如果没有传入参数会报错,返回值可以自动以,如果没有找到对应的key值,需要设置自定义返回值。自定义值只有在找不到对应key时,才会代替返回值
popitem():无参数,在3.5之前的版本为随机删除,在3.6之后的版本为默认删除最后一个key
clear():清除整个字典
del dic[‘name’ ]:作为关键字根据key值来删除,找不到会报错,所以不常用

print(dic2.pop("age"))               # 有返回值为删除的value
print(dic2.pop("hallo", '没有此键'))  # 删除不知道有没有的key时,可设置返回值None
# print(dic2.pop())                  # 如果没有传参数会直接报错
# print(dic2)
# print(dic2.popitem())              # 删除最后一个
# dic2.clear()                       # 清空
# del dic2['name1']                  # 没有该key会报错所以不常用
del dic2                             # 删除整个字典,使dic2不存在
print(dic2)

3.字典操作:修改
直接修改:类似于增添针对存在的key值会覆盖原始的value
dic2.update(dic1)会表把字典dic1中有但是dic2中没有的key添加到dic2中,已经存在于两个字典的key,则将dic1中的value复制到dic2中

dic1["age"] = 16                     # 已有的key覆盖
dic = {'name': "Tony", 'wight': 120, }
dic1 = {"name": "jerry", "age": 18, "sex": "male", }
dic.update(dic1)

4.1字典操作:查询
直接查询:字典的key,value的值为列表,如果查询item为元组类型

dic1 = {"name": "jerry", "age": 18, "sex": "male", }
print(dic1.keys(), type(dic1.keys()))      # 列表
print(dic1.values(), type(dic1.values()))  # 列表
print(dic1.items(), type(dic1.items()))    # 元组
for i in dic1:   # 默认打印出的是key
     print(i)
 for i in dic1.values():
     print(i)

4.2插入一个面试赋值题:一行代码修改a,b的赋值,赋值语句会自动判断前后的变量数目来确定后面的最小单位。

a = 1
b = 2
a, b = b, a
print(a, b)
a, b = [1, 2]      # 相当于自动识别,判断最小单位,一一对应
a, b = [1, 2], [2, 3]

4.3同理就可以去除掉字典中item的括号

for a,b in dic1.items():
#    a, b = i
    print(a,b)

4.4字典查询:get()
直接查询:如果没有找到相应key值会报错
get(key, 自定义返回值)类似与删除的pop()如果没有找到相对应的key值,可以自顶一个返回值,这样可以避免报错的发生,比较实用

# print(dic["name1"])                 # 找不到会报错
print(dic.get('name1', '没有这个键'))  # 找不到不会报错

5.字典嵌套:字典中可以嵌套各种其他类型数据

dic = {
    'name': ['jerry', 'tony', 'hello'],
    'py': {
        'time': '5.4',
        'money': 15000,
        'addr': 'CBD',
    },
    'age': 21,
}

dic['age'] = 45
dic['name'].append('jake')
dic['name'][1] = dic['name'][1].upper()
print(dic['name'])
dic['py'].setdefault('weather', 'sunny')
print(dic['py'])

6.作业示例:将一段字符串中的数字个数计算出来,包括连在一起的多位数字按一个处理。
解决思路:将字母类型的诗句全部替换为空然后再按空分割,最后计算分出的个数即可

info = input('>>>')  # asdasd123asdqwe7845dsa56

for q in info:
    if q.isalpha():
        info = info.replace(q, ' ')
l = info.split()
print(len(l))

7.在字典中删除key中包括‘k ’的元素:字典是无法再for循环中删除元素的

# 新建字典存值
dic1 = {'kl': 'a1', 'km': 'a2', 'ml': 'a3', }
dic2 = {}
for i in dic1:
    if 'k' not in i:
        dic2.setdefault(i, dic1[i])
    else:
        pass
print(dic2)
# 将被删key存入列表中在进行删除
dic1 = {'kl': 'a1', 'km': 'a2', 'ml': 'a3', }
li1 = []
for i in dic1:
    if 'k' in i:
        li1.append(i)
for j in  li1:
    dic1.pop(j)
print(dic1)

8.字典

python 字典数据类型 键 python字典类型操作_自定义