字典和集合

一.初始字典

why:目前已经学习了容器型数据类型有list和tuple,list够用吗,有什么缺点
    1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢
    2.列表只能按照顺序存储,数据与数据之间的关联性不强
所以针对以上的缺点,需要引入另一种容器型的数据类型,解决上面的问题,这就需要dict字典。

what:
    数据类型可以按照多种角度进行分类,就跟咱们人一样,人按照地域可以划分分为亚洲人,欧洲人,美洲人等,但是按照肤色又可以分为白种人,黄种人,黑种人,等等,数据类型可以按照不同的角度进行分类,先给大家按照可变与不可变的数据类型的分类:
    不可变(可哈希)的数据类型:int,str,bool,tuple。
    可变(不可哈希)的数据类型:list,dict,set。
字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的:
    Key:不可变(可哈希)的数据类型.并且键是唯一的,不重复的。
    Value:任意数据(int,str,bool,tuple,list,dict,set),包括后面要学的实例对象等。
    在Python3.5版本(包括此版本)之前,字典是无序的。
    在Python3.6版本之后,字典会按照初建字典时的顺序排列(即第一次插入数据的顺序排序

  在Python3.7版本之后,有序。

 当然,字典也有缺点:他的缺点就是内存消耗巨大。

二.字典的几种创建方法

复制代码
# 字典
# 方法一:使用list或者tuple来创建
dic = dict([('name', 'huangping'), ('city', 'hangzhou'), ('hobby', ['电脑', '手机'])])
# dic = dict((('name','huangping'),('city','hangzhou'),('hobby',['电脑','手机'])))
print(dic)
# 方法二:
dic = dict(one=1, two=2, three=3)
print(dic)
# 方法三:
dic = dict({'one': 1, 'two': 2, 'three': 3})
# dic = {'one': 1, 'two': 2, 'three': 3}
print(dic)

# 方法四: 后面会讲到先了解
dic = dict(zip(['one', 'two', 'three'],[1, 2, 3]))
print(dic)

# 方法五: 字典推导式 后面会讲到
# dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]}
# print(dic)

# 方式六:利用fromkey后面会讲到。
# dic = dict.fromkeys('abcd','太白')
# print(dic)  # {'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
复制代码
# 不合法
# dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key
# dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
# dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key

三.字典的增删改查

复制代码
#字典的增删改查
dic = {'name': '黄平', 'city': '杭州', 'age': 31}

#方法一:通过键值对直接增加
dic['hobby'] = '上网'    #key 存在这是改,不存在则是增加
dic['age'] = 18
print(dic)

结果:
{'name': '黄平', 'city': '杭州', 'age': 18, 'hobby': '上网'}

#方法二:setdefault
dic.setdefault('hobby','shangwang')     # key 存在则不变,key不存在则添加,后面的参数为新增的key的value,不写value这默认value为None
print(dic)
dic.setdefault('city','上海')
print(dic)
ret = dic.setdefault('city','上海')   # 有返回值
print(ret)

结果:
{'name': '黄平', 'city': '杭州', 'age': 31, 'hobby': 'shangwang'}
{'name': '黄平', 'city': '杭州', 'age': 31, 'hobby': 'shangwang'}
杭州
复制代码

复制代码
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
#方法一:pop 根据可以删除
dic.pop('age')      # 默认情况key 值不存在会报错
ret = dic.pop('hobby','key不存在')   #加上第二个参数,key不存在不会报错,会有返回值,key 存在则返回value值
print(ret)
print(dic)

结果:
key不存在
{'name': '黄平', 'city': '杭州'}

#方法二:clear 清空
dic.clear()
print(dic)

结果:
{}

#方法三:del
del dic['name']
print(dic)

del dic         #删除整个字典
print(dic)
复制代码

 

复制代码
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
dic['name'] = '小白'
print(dic)


结果:
{'name': '小白', 'city': '杭州', 'age': 31}

# update
dic = {'name': '太白', 'age': 18}
dic.update(sex='', height=175)
print(dic) # {'name': '太白', 'age': 18, 'sex': '男', 'height': 175}

dic = {'name': '太白', 'age': 18}
dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')])
print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}

dic1 = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic1.update(dic2)
print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
print(dic2) # {'name': 'alex', 'weight': 75} 
复制代码

复制代码
dic = {'name': '黄平', 'city': '杭州', 'age': 31}
# 通过键值查
print(dic['name'])      # 黄平,键值不存在则报错

# 通过get
print(dic.get('name','值不存在'))  #键存在,则返回value,键值不存在,如果第二个参数为空值返回None ,不为空则返回参数值

# keys  返回键值
for key in dic.keys():
    print(key)

结果:
name
city
age

# values 返回value
for value in dic.values():
    print(value)

结果:
黄平
杭州
31


# item 返回key和value
for key,value in dic.items():
    print(key,value)

结果:
name 黄平
city 杭州
age 31
复制代码

 

相关练习:

复制代码
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
dic['k4'] = 'v4'
print(dic)
# 请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
dic['k1'] = 'alex'
print(dic)
# 请在k3对应的值中追加一个元素 44,输出修改后的字典
dic['k3'].append(44)
print(dic)
# 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
dic['k3'].insert(0,18)
print(dic)

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{'k1': 'v1', 'k2': 'v2', 'k3': [11, 22, 33], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [11, 22, 33], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [11, 22, 33, 44], 'k4': 'v4'}
{'k1': 'alex', 'k2': 'v2', 'k3': [18, 11, 22, 33, 44], 'k4': 'v4'}
复制代码

 

四.字典的嵌套

典的嵌套是非常重要的知识点,这个必须要建立在熟练使用字典的增删改查的基础上,而且字典的嵌套才是咱们在工作中经常会遇到的字典,工作中遇到的字典不是简简单单一层,而就像是葱头一样,一层接一层,但一般都是很有规律的嵌套,那么接下来我们就学习一下字典的嵌套:

 

复制代码
dic = {
    'name':'汪峰',
    'age':48,
    'wife':[{'name':'国际章','age':38}],
    'children':{'girl_first':'小苹果','girl_second':'小怡','girl_three':'顶顶'}
}

# 1. 获取汪峰的名字。
print(dic['name'])
# 2.获取这个字典:{'name':'国际章','age':38}。
print(dic['wife'][0])
# 3. 获取汪峰妻子的名字。
print(dic['wife'][0]['name'])
# 4. 获取汪峰的第三个孩子名字。
print(dic['children']['girl_three'])

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
汪峰
{'name': '国际章', 'age': 38}
国际章
顶顶
复制代码

 

练习:

复制代码
dic1 = {
 'name':['alex',2,3,5],
 'job':'teacher',
 'oldboy':{'alex':['python1','python2',100]}
 }
# 1,将name对应的列表追加⼀个元素’wusir’。
dic1['name'].append('wusir')
print(dic1)
# 2,将name对应的列表中的alex⾸字⺟⼤写。
dic1['name'][0] = dic1['name'][0].title()
print(dic1)
# 3,oldboy对应的字典加⼀个键值对’⽼男孩’,’linux’。
dic1['oldboy']['老男孩'] = 'linux'
print(dic1)
# 4,将oldboy对应的字典中的alex对应的列表中的python2删除
dic1['oldboy']['alex'].remove('python2')
print(dic1)

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{'name': ['alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100], '老男孩': 'linux'}}
{'name': ['Alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 100], '老男孩': 'linux'}}
复制代码

 

复制代码
# 有字符串 "k: 1|k1:2|K2:3 | k3 :4 处理成字典{'k':1,'k1':2...}
msg = 'k: 1|k1:2|K2:3 | k3 :4'
lis = msg.split('|')
dic = {}
for i in lis:
    key,value = i.split(':')
    dic[key.strip()] = value.strip()
print(dic)

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{'k': '1', 'k1': '2', 'K2': '3', 'k3': '4'}
复制代码

 


复制代码
# v = {}
# for index in range(10):
#     v['users'] = index
# print(v)    # {'users':9}

# 商品列表:
# goods = [
#     {"name": "电脑", "price": 1999},
#     {"name": "鼠标", "price": 10},
#     {"name": "游艇", "price": 20},
#     {"name": "美女", "price": 998}
# ]
# 需求:
# 1.页面显示 序号 + 商品名称 + 商品价格,如:
#         1 电脑 1999
#         2 鼠标 10
#         ...
# 2.用户输入选择的商品序号,然后打印商品的名称及商品价格
# 3.如果用户输入的商品序号有误,则提示输入有误,并重新输入
# 4.用户输入Q或者q,退出程序
goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998}
]
while 1:
    # for index in range(len(goods)):
    #     print('{}\t{}\t{}'.format(index + 1, goods[index]['name'], goods[index]['price']))
    """ 
    或者
    使用enumerate方法
    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
    """
    for index,dic in enumerate(goods,start=1):
        print('{}\t{}\t{}'.format(index,dic['name'],dic['price']))
    choice_num = input("请输入商品序号(Q/r退出):").strip()
    if choice_num.isdecimal():
        if 0 < int(choice_num) <= len(goods):
            print("你输入的商品名称为{},价格为{}".format(goods[int(choice_num) - 1]['name'],
                                                         goods[int(choice_num) - 1]['price']))
        else:
            print("你输入超出范围,请重新输入")
    elif choice_num.upper() == 'Q':
        break
    else:
        print("输入非字母元素,请重新输入")
复制代码

 五、集合

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可以变类型),但是集合本身是不可哈希的(所以集合不能作为字典的键。
集合的两个重点:
    去重,把一个列表变成集合,就自动去重了。
    关系测试,测试两组数据之间的交集、差集、并集等关系


1.集合的创建

复制代码
set1 = set({1,2,'aaa'})
set2 = {1,2,'aaa'}
print(set1,type(set1))
print(set2,type(set1))
set3 = set()  #创建空集合
dit = {}      #创建空字典
print(set3,type(set3))
print(dit,type(dit))
结果: D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py {
1, 2, 'aaa'} <class 'set'> {1, 2, 'aaa'} <class 'set'> set() <class 'set'> {} <class 'dict'>



set1 = {1,2,'ccc',3,'aaa',1,1,22,3}
print(set1) #去重且无序


结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py
{1, 2, 3, 22, 'ccc', 'aaa'}


复制代码

2.集合的增

复制代码
set1 = {1,2,3,'aaaa'}
set1.add('bbb')
print(set1)

#update:迭代着增加
set1.update('A')
print(set1)
set1.update('老师')
print(set1)
set1.update(['c','d','e'])
print(set1)


结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{1, 2, 3, 'bbb', 'aaaa'}
{1, 2, 3, 'bbb', 'aaaa', 'A'}
{1, 2, 3, '', 'bbb', 'aaaa', '', 'A'}
{1, 2, 3, 'e', '', 'c', 'bbb', 'aaaa', '', 'A', 'd'}
复制代码

3.集合的删除

复制代码
set1 = {1,2,3,'aaaa'}
set1.remove(1)  #删除一个元素
print(set1)

set1.pop()      #随机删除一个元素
print(set1)

set1.clear()    #情况集合
print(set1)

del set1        #删除集合
print(set1)

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{'aaaa', 2, 3}
{2, 3}
set()
Traceback (most recent call last):
  File "D:\pythonProject\python3\day10\s1.py", line 13, in <module>
    print(set1)
NameError: name 'set1' is not defined. Did you mean: 'set'?

Process finished with exit code 1
复制代码

4.集合的改

集合不支持直接改动,可以先删除后增加来实现改的操作

 

5.集合的其他操作

5.1 交集

复制代码
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)
print(set1.intersection(set2))

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{4, 5}
{4, 5}
复制代码

 

 

5.2 并集

复制代码
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2)
print(set1.union(set2))

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
复制代码

 

5.3 差集

复制代码
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2)
print(set1.difference(set2))

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{1, 2, 3}
{1, 2, 3}
复制代码

 

5.4 反交集

复制代码
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2)
print(set1.symmetric_difference(set2))

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
{1, 2, 3, 6, 7, 8}
{1, 2, 3, 6, 7, 8}
复制代码

 

5.5 子集与超集

复制代码
set1 = {1,2,3}
set2 = {1,2,3,4,5}
print(set1 < set2)
print(set1.issubset(set2))      #这两个都是True说明,set1是set2的子集

print(set2 > set1)
print(set2.issuperset(set1))    #这两个都是True说明,set2是set1的超集集

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
True
True
True
True
复制代码

5.6 frozenset不可变集合,让集合变成不可变类型。

s = frozenset('barry')
print(s,type(s))

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
frozenset({'b', 'r', 'a', 'y'}) <class 'frozenset'>

 

六、enumerate

 

enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。

复制代码
l1 = ['a','v','c']
for i in enumerate(l1):
    print(i)

for index,val in enumerate(l1,start=1):
    print(index,val)

结果:
D:\pythonProject\python3\venv\Scripts\python.exe D:\pythonProject\python3\day10\s1.py 
(0, 'a')
(1, 'v')
(2, 'c')
1 a
2 v
3 c
复制代码

 

 练习题:

复制代码
cars = ['鲁A4546','鲁B12565','京B8888','黑C6666','黑C4444','沪B34252','鄂A7777']
lolcals = {'':'上海','':'黑龙江','':'山东','':'湖北','':'湖南','':'北京'}
dic = {}
# 结果:{'黑龙江':2,'山东':1,'北京':1}
# 方法一:
# for i in cars:
#     if i[0] in dic.keys():
#         dic[i[0]] += 1
#     else:
#         dic[i[0]] = 1
# print(dic)

# # 方法二:
# for i in cars:
#     dic[i[0]] = dic.get(i[0],0) + 1
# print(dic)
复制代码

 

 

 
posted @   小白_XiaoBai  阅读(205)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示