20.Python字典类型及常用内置方法

本文详细介绍了Python字典的定义、查询、修改、删除、取值等操作,包括普通定义、快速生成、成员运算、更新与删除等,并提供了实例演示。此外,还讲解了在不确定键是否存在时如何安全取值,以及Python3与Python2中字典方法的区别。通过实例练习加深理解。
摘要由CSDN通过智能技术生成

1.字典

字典能准确的存储数据。
特征:大括号括起来,可以存放多个元素,元素之间用逗号隔开,元素为K:V键值对形式。

K > Key:对v的描述信息,一般为字符串。
V > Value:真正的数据,相当于变量的值,可以是任意类型。
键是唯一的,如果重名,键会绑定给后面的值。
k必须是不可变类型(eg:整数,浮点数,字符串。),value可以是任意类型
字典是无序的,Python2中
>>> dict1 = {'k1': 'v1', 'k2': 'v2'}
>>> dict1
{'k2': 'v2', 'k1': 'v1'}

在这里插入图片描述

2.定义字典

2.1普通定义
dic1 = {  # 多行书写
    'name1': 'monkey',  # 键为字符串
    1: 'cat',  # 键为整型
    2.0: 'tiger'  # 键为浮点型
}
print(type(dic1))
print(dic1['name1'])  # 通过键 访问值
print(dic1[1])  # 访问不存在的值会报错
print(dic1[2.0])

# 键冲突
dic2 = {'k1': 'v1', 'k1': 'v2'}
print(dic2)  # {'k1': 'v2'}
2.2其他方式
# 其他方式
dic2 = dict(k1='v1', k2='v2', k3='v3')
print(dic2)

# dict 内部源码 上面的创建字典,内部实现原理
list1 = [['k1', 'v1'], ['k2', 'v2'], ['k3', 'v3']]
d = {}
for k, v in list1:
    d[k] = v
print(d)

# 列表可以元组也可以
dic = dict([('k1', 'v1'), ('k2', 'v2')])

print(dic)  # {'k1': 'v1', 'k2': 'v2'}

# 另一种写法
d = {}  # 创建空字典
for i in list1:
    d[i[0]] = i[1]  # d{k1=v1} == {'k1': 'v1'}
print(d)
2.3 快速生成字典
dict.formkeys('键元素', '值元素')
x = ['a', 'b', 'c']  # 列表的元素被作为键
list_1 = dict.fromkeys(x, 1)  # 统一添加值
print(list_1)
x = ['a', 'b', 'c']  # 列表的元素被作为键
list_1 = dict.fromkeys(x, [])  # 如果为[]列表的话,所有的键都指向同一个内存地址。
print(list_1)
list_1['a'] = 1  # {'a': 1, 'b': [], 'c': []}, 等号赋值是重新指向一个新分空间
print(list_1)

在这里插入图片描述

x = ['a', 'b', 'c']  # 列表的表项被作为键
list_1 = dict.fromkeys(x, [])  # 如果为[]列表的话,所有的键都指向同一个内存地址。
# 内部复制与链式赋值一样,后一个变量指向前一个变量指向的值
print(list_1)
list_1['a'].append(1)  # {'a': [1], 'b': [1], 'c': [1]}
print(list_1)

3.查询字典

3.1查看字典
.keys()   查看键
.values() 查看值
.items()  查看键值对

Python3 这些方法返回一个'dict_keys'视图对象。无法理解就直接看成是列表(需要list()转换)。
'dict_keys'对象不支持索引。可以使用for遍历取值。

Python2 则是真正的列表.       
dic1 = {'name': 'kid', 'age': 18, 'hobby': ['read', 'eat']}
print(dic1.keys())  # dict_keys(['name', 'age', 'hobby'])
print(dic1.values())  # dict_values(['kid', 18, ['read', 'eat']])
print(dic1.items())  # dict_items([('name', 'kid'), ('age', 18), ('hobby', ['read', 'eat'])])


# 一般不会去转
print(type(dic1.keys()))  # dict_keys(['name', 'age', 'hobby'])
dic2 = list(dic1.keys())
print(dic2)  # ['name', 'age', 'hobby']
# Python2:
dic1 = {'name': 'kid', 'age': 18, 'hobby': ['read', 'eat']}
print(dic1.keys())  
print(dic1.values())  
print(dic1.items())  

"""
['hobby', 'age', 'name']
[['read', 'eat'], 18, 'kid']
[('hobby', ['read', 'eat']), ('age', 18), ('name', 'kid')]
"""
3.2.查询是否存在
.get() 方法 通过字典key获取字典的value值。
.get('键名称', '键不存在返回的信息') 有两种种返回的结果
情况1:键存在返回值
情况2:键不存在,返回提示信息,默认为None, 可以自定义返回指定的内容。
1.普通访问
访问不存在的键时,正常访问 直接报错。
dic1 = {'name1': 'monkey', 'name2': 'cat', 'name3': 'tiger'}
print(dic1['name1'])
print(dic1['age'])  # KeyError: 'age'
2.get方法
推荐的查询使用.get()方法。
就算自己的代码有问题也不能直接就报错。
dic1 = {'name1': 'monkey', 'name2': 'cat', 'name3': 'tiger'}
print(dic1.get('age'))  # None
print(dic1.get('age', '键不存在'))  # 键不存在
3.3元素统计
len() 统计字典中字典中键值对的个数。
dic1 = {'k1': 'v1', 'k2': 'v2'}
print(len(dic1))  # 2
3.4成员运算
in  not in
判断某个值是否在某个群体中,返回值为布尔值。
字典中只默认提供key的访问,value不会暴露。
可是使用.values()  .items() 将value值展示。
dic = {
    'name1': 'monkey',
    'name2': 'cat',
    'name3': 'tiger'
}
print('name1' in dic)  # True
print('aaa' not in dic)  # True


print('monkey' in dic)  # False
print('monkey' in dic.values())  # True
print('monkey' in dic.items())  # True
print(dic.values())
print(dic.items())

"""
dict_values(['monkey', 'cat', 'tiger'])
dict_items([('name1', 'monkey'), ('name2', 'cat'), ('name3', 'tiger')])
"""
# items() 先看成是列表套元组
for items in dic.items():
    if 'monkey' in items:
        print('monkey' in items)

4.修改字典

4.1替换
.setdefault('键名', '值') 
键值一起写,查询键对值不存在的会则新建;
值省略,只写键,不存在返回Noune,键存在获取到键对应的值。
dict_1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
dict_1.setdefault('k4','v4')  # __键 , __值
print(dict_1)
print(dict_1.setdefault('k4'))  # v4
print(dict_1.setdefault('k5',))  # 只写键,不存在返回Noune
4.2更新
update() 键不存在则新建,存在则修改。
dict(元素1 元素2) 
dict_1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
dict_1.update({'k4': 'V4'})  # 不存在则添加
print(dict_1)
dict_1.update({'k1': '6'})  # 键存在则修该值
print(dict_1)

# 字典合并
v1 = {"k1": 1, "k2": 2}
v2 = {"k2": 22, "k3": 33}

dic = dict(v1, **v2)

print(dic)

# Python 3.9
v1 = {"k1": 1, "k2": 2}
v2 = {"k2": 22, "k3": 33}

v3 = v1 | v2

print(v3)
 update 更新字典 a,会有两种情况:
 1)有相同的键时:会使用最新的字典 b   key 对应的 value 值。
 2)有新的键时:会直接把字典 b 中的 key、value 加入到 a 中。
a = {'k1': 'v1', 'k2': 'v2'}
b = {'k3': 'v3', 'k4': 'v4'}
a.update(b)
print(a)  # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}

5.删除元素

 del 删除 指定元素
.pop()  弹出元素,在字典中这个方法不提供索引。
.clear() 清空字典。
.popitem() 随机弹出一组键值。(看起来像是从末尾弹出,不要被迷惑了。)
	为什么是“随机”,创建的字典是无序的,字典是怎样的顺序并不清楚。
dict1 = {
    'name1': 'monkey',
    'name2': 'cat',
    'name3': 'tiger'
}

del dict1['name1']  # del 删除dict1字典中 name1键对值
print(dict1)
dict1.pop('name2')  # 弹出, 索引无法使用
print(dict1)
# 清除字符
dict1.clear()
print(dict1)  # {}
dic1 = {'name': 'kid', 'age': 18, 'hobby': ['read', 'eat']}
print(dic1.popitem())  # ('hobby', ['read', 'eat'])
print(dic1)  # {'name': 'kid', 'age': 18}

6.取值

for 循环 遍历字典。
for 遍历 视图对象 获取值。
在使用items()的时候,变量必须跟取的元素数量一致。
dic1 = {'name': 'kid', 'age': 18, 'hobby': ['read', 'eat']}
# 迭代输出键名
for i in dic1.keys():
    print(i, end='   ')

print()

# 迭代输出值
for i in dic1.values():
    print(i, end='   ')

print()

# 迭代输出键对
for k, v in dic1.items():
    print(k, v, end='   ')

print()

# 迭代输出键对
for item in dic1.items():
    print(item, end='   ')
print()

# 迭代输出键对并解压赋值
for x, y in dic1.items():
    print(x, y,  end='   ')
print()
name   age   hobby   
kid   18   ['read', 'eat']   
name kid   age 18   hobby ['read', 'eat']   
('name', 'kid')   ('age', 18)   ('hobby', ['read', 'eat'])   
name kid   age 18   hobby ['read', 'eat']   

7.练习

1.统计字符的个数以字典的形式显示。
str = "asdfmaslsopdfjosdjfjsdfogjsdgsadjfaojfiajsdfoihaiwehrqowfjskdnfarwhfjkklnwaoiejfo;asfnasCmskdvn"

dic = {}
for i in str:
    if i in dic:
        dic[i] += 1
    else:
        dic[i] = 1
print(dic)
# 2.有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,
# 将小于 66 的值保存至第二个key的值中
# 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dic1 = {'k1': []}
dic2 = {'k2': []}
for i in l1:
    if i < 66:
        dic1['k1'].append(i)
    else:
        dic2['k2'].append(i)
print(dic1)
print(dic2)
# 3.统计s='hello word word xx hello xx xx'中每个单词的个数
# 即: {'hello': hello的个数, ...}

s = 'hello word word xx hello xx xx'
list1 = s.split()
dic = {}
print(list1)
for i in list1:
    if i not in dic:
        dic[i] = list1.count(i)

print(dic)
4.简单购物车,要求如下:
实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,
购买个数以列表形式{'商品名': [价格, 购买个数], ...}数加入购物列表,
如果输入为空或其他非法输入则要求用户重新输入(只能输入纯数字字符和字母q),按下q退出并打印购物列表.
shop_dic = {
    '苹果': 5.6,
    '香蕉': 4.8,
    '西瓜': 3.5,
    '葡萄': 8.9,
    '桃子': 5.0,
}
shop_dic = {
    '苹果': 5.6,
    '香蕉': 4.8,
    '西瓜': 3.5,
    '葡萄': 8.9,
    '桃子': 5.0,
}
# 打印信息
for k, v in shop_dic.items():
    print(f'{k} 价格 {v}')

# 创建一个购物车字典
shop_cat = {}
while True:
    fruits = input('输入水果的名字>>>:').strip()
    # 判断输入的名字是否存在字典中,不存在就输入错了
    if fruits not in shop_dic:
        print('输入的水果不存在!')
    else:
        # 水果存在就输入数量
        num = input('请输入购买的数量>>>:').strip()
        # 纯数字判断
        if num.isdigit():
            # 判断是否已经添加到购物车了
            if fruits in shop_cat:
                # 添加过修改数量
                shop_cat[fruits][1] += int(num)
            else:
                # 没添加就组织格式
                list_msg = [shop_dic[fruits], int(num)]
                # 添加到购物车
                shop_cat[fruits] = list_msg
        else:
            print('输入的数量格式不正确!')
        print(shop_cat)
    if input('按下q退出购物,否则继续>>>:').strip() == 'q':
        break
5.在我无法确定key是否存在的情况下,如何从字典中取值才能保持程序不会出错
6.简述Python3中dict.keys()、dict.values()、dict.items()包含的内容及
  与Python2的区别
7.字典键不存在有几种方法创建一堆键值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值