1.列表
l = [1, 2, 3, 4, 2, 2, ]
res = l.count(2)
print(res)
print(l.count(2)) # 3 2在列表中出现了三次
print(l.count(3)) # 1 2在列表中出现了一次

l.clear 清空
print(l.clear()) # none 没有返回值
print(l) # [] 空列表

l.reverse() 反转
print(l.reverse) # none 没有返回值
print(l) # [2, 2, 4, 3, 2, 1] 反转列表

l=[3,2,4,5,]
l.sort() 排序升
print(l) # [2 ,3 ,4 ,5 ,]
1.sort(reverse=True)
print(l) 排序降 # [5, 4, 3, 2,]

5.队列与堆栈
# 队列 先进先出
# l1 = []
# # 先进
# l1.append('first')
# l1.append('second')
# l1.append('third')
# # 先出
# print(l1.pop(0))
# print(l1.pop(0))
# print(l1.pop(0))

# # 堆栈 先进后出
# l1 = []
# l1.append('frist')
# l1.append('secound')
# l1.append('thrid')
# # 先出
# print(l1.pop())
# print(l1.pop())
# print(l1.pop())

6.元组 tuple
res = tuple((1, 2,)) #定义元组
print(res) # (1, 2)
print(type(res)) # <class 'tuple'>

# # # 在定义容器类型的时候,哪怕内部只有一个元素,你也要用逗号隔开 区分一下(******)
# # 因为当定义元组时如果()中只有一个元素会识别成数字,字符串或者其他的东西,只有加了逗号才能识别为元组

t = (1, 2, 3, 'a', 'b', [1, 2, 3])
print(t[0]) # 1 元组可索引
t[-1] = 'haha'
print(t) # 报错 元组不可更改性
t[-1][0] = '我改了'
print(t) # (1, 2, 3, 'a', 'b', ['我改了', 2, 3]) 元组中的列表为可变类型所以可以改这个列表的值

t = (1, 2, 3, 'a', 'b', [1, 2, 3])
del t[0]
print(t) # 报错 元组不可删除性

# 切片(顾头不顾尾,步长)
# print(t[::2])
# 长度
# print(len(t))
# 成员运算in和not in
# print('a' in t)
# 循环
# for i in t:
# print(i)

"""
能存多个值
有序
不可变
"""

7.集合
"""
1.关系运算
2.去重
"""
s = {1, 2, 3, 4, } # <class 'set'>
print(type(s))
s1 = set({7, 8, }) # 定义集合
print(type(s1))
s2 = set()
print(type(s2)) # 空集合

要注意
# x = {} # <class 'dict'> 如果你仅仅只写了一个大括号 那么python默认将它当做字典类型
# print(type(x))

# 集合的元素遵循三个原则:
# 1:每个元素必须是不可变类型
# 可变:不可hash
# 不可变:可hash
# s = {1,2,3,4,5,6,'a',(1,2),[1,2]} # 报错
# s = {1,2,3,4,5,6,'a',(1,2),{"name":'jason'}} # 报错

s = {1, 2, 3, 3, 4, 4, }
print(s) # {1, 2, 3, 4} 会将重复的元素自动去除
print(s[1]) # 报错 不可索引的都是 无序
# 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值

7.集合的用法
# 父集:>,>= 子集< ,<=
s = {1, 2, 3, 4, 55}
s2 = {1, 2, 666}
s3 = {1, 3, 2, }
print(s >= s2) # false 检测s是否包含了s2
print(s3 <= s) # True 检测s3是否存在于s中
"""
了解
issubset()
issuperset()
"""

pythons = {'jason', 'nick', 'tank', 'egon', 'kevin', 'owen', 'alex'}
linux = {'frank', 'jerry', 'tank', 'egon', 'alex'}
# 既报名python也报名linux的学生姓名
print(pythons & linux) # 交集

# 只报名python的学生姓名
print(pythons - linux)

# 只报名linux的学生姓名
print(linux - pythons)

# 没有同时报名两门课程的学生姓名
print(pythons ^ linux) # 对称差集

# 取出所有报了名的学生姓名
print(pythons | linux) # 并集

s = {1, 2, 3, 4, 5}
print(s.add(666))
print(s.add((1, 2, 3, 4))) # 将容器类型也当成一个元素传入

8.字典
d3 = {'name': 'jason', 'password': '123'}
print(d3['name']) # jsason
d3['name'] = 'egon'
print(d3['name']) # egon 通过key去改变value

d2 = {'name': 'jason', 'name': 'tank', 'name': 'nick', 'password': 123}
print(d2['name']) # nick 强调:字典的key是不能重复的 要唯一标识一条数据
# 如果重复了 只会按照最后一组重复的键值对存储

d3 = {'name': 'jason', 'password': '123'}
d3['age'] = 18 # 赋值语句当key不存在的情况下,会自动新增一个键值对(******)
print(d3) # {'name': 'jason', 'password': '123', 'age': 18}

删除
# d3 = {'name':'jason','password':'123'}
# del d3['name'] # 只对键操作就可以了

# res = d3.pop('name') # 弹出仅仅是value
# res = d3.pop('age') # 当键不存在的时候直接报错

d3 = {'name': 'jason', 'password': '123'}
d3.clear()
print(d3)# {} 清空

9.定义字典 三种
其一 直接命
# d1 = {'name':'jason','password':123}

其二 通过函数命
# d2 = dict(name='jason',password=123,age=18) #
# print(d2,type(d2))

其三 解压赋值法 只做了解

10.字典k-y获取 key(),value()键值对items()

d1 = {'name': 'jason', 'password': 123}
print(d1.keys()) # dict_keys(['name', 'password']) 老母猪即迭代器对象可以把它当作一个列表

for k in d1.keys():
print(k)

# print(d1.values()) # dict_values(['jason', 123])

print(d1.items()) # dict_items([('name', 'jason'), ('password', 123)])
# 就把它看成是列表套元组,元组的第一个元素是字典的key 第二个元素是字典的value

11.字典通过key获取value的方式 2种 区别在于是否会报错
其一
d1 = {'name':'jason','pwd':123}
print(d1['name']) # jason
print(d1['age']) # 报错 不存在age键

其二 dict.get()
d1 = {'name': 'jason', 'pwd': 123}
print(d1.get('name')) # jason
print(d1.get('name', 'ao')) # jason name键存在会打印对应键的值
print(d1.get('age')) # None 当字典的key不存在的情况 不报错 返回None
print(d1.get('age', 'ao')) # ao age键不存在会返回输入的第二个元素ao
# 所以res = print(d1.get('age', 'ao'))存在,就像pop()可以取返回值,而del不能取返回值一样

12.dict.fromkeys() 快速的创建一个字典
l1 = ['name','password','age','hobby']
print(dict.fromkeys(l1,123)) # {'name': 123, 'password': 123, 'age': 123, 'hobby': 123}

12.dict.popitem() 弹出
d1 = {'name':'jason','age':18}
# dict.popitem()
print(d1.popitem()) # ('age', 18) 尾部以元组的形式弹出键值对

13.dict.setdefault() 新增键值对
d1 = {'name': 'jason', 'pwd': 123}
res1 = d1.setdefault('name', 'xxoo')
print(d1, res1) # {'name': 'jason', 'pwd': 123} jason 当键存在的情况下 不修改值 并且将原先key对应值返回给你
res2 = d1.setdefault('age', 18)
print(d1, res2)# {'name': 'jason', 'pwd': 123, 'age': 18} 18 当键不存在的情况下 新增一个键值对 并且将新增的键值对的值返回给你

14.dict.update() 更新键值对
d1 = {'name':'jason','pwd':123}
d2 = {"age":18}
d1.update(age=666)
print(d1) # {'name': 'jason', 'pwd': 123, 'age': 666}

d1 = {'name': 'jason', 'pwd': 123}
d3 = {"age": '18', 'name2': 'ao'}
d1.update(d3)
print(d1) # {'name': 'jason', 'pwd': 123, 'age': '18', 'name2': 'ao'}
# 把字典3中的值更新到字典一里

1 = {'name': 'jason', 'password': 123}
d1['age'] = 18
print(d1) # {'name': 'jason', 'pwd': 123, 'age': 18} 添加一个age键值对

15.
可变:list dict set
不可变 int float str tuple bool