python基础——5(元组、字典、集合)

上节复习:
# 数字类型
# int:py3|py2  long:py2
# float: 3.14
# complex(5, 4) => 5 + 4j
num = 123456789012345678901234567890123456789012345678901234567890
print(num)
print(int('123'))

# 字符串:*******
# '' "" """"""
# len() [index] [::]

# 列表类型
# [1, 3.14. 'abc', True, []]
# len() [index|-index] [::] => 有序,存放多个值
# 增删改查

# 可变不可变类型
# 不可变:在id不改变的情况下,无法修改值
# 可变:在id不改变的情况下,可以修改(内部)值

a = [1, 2]
print(id(a))
a = [3, 4]
print(id(a))

# 今日内容
# 元组 ***
# 字典 *****
# set *

一、元组

1、定义:

t1 = ()   #元组一旦定义不可改变,不要定义空的元组

#参数为for可以循环遍历的对象(可迭代对象)

t2 = tuple("123")
print(t2,type(t2))
t3 = tuple([1,2,3])
print(t3,type(t3))
t4 = tuple((7,8,9))
print(t4,type(t4))

# 思考:如何定义一个只有一个值的元组

# “Owen”
print(("Owen",))
print(tuple(['Owen']))

# 总结
t = (1,2,3)
t = (1,)

# 常用操作
# 元组有序存储
# 按索引取值
t = (1,2,3,2,3,2)
print(t[1])
print(t[-2])

# 切片
print(id(t))
nt = t[:-1:]
print(nt,id(nt))

# 长度(item元素个数)
print(len(t))

# 元组内置方法
print(t.count(2))        # 该数据集合可以存放相同数据
print(t.index(2,2,3))    # ValueError: tuple.index(x): x not in tuple

# 案例一:
# 有一个老师老师列表,打算开除,如果是校长亲友团,免开
# 原始列表为list类型
# 手动输入是否是亲友团,决定是否开除
teas = ['Bob','Alex']
friends = input("亲友团[0,1]:")
if friends == '1'
    teas = tuple(teas)
#判断teas对象是否是tuple类型
if not isinstance(teas,tuple):  #老师是否是亲友团,不是就删除
    teas.clear()
for t in teas:
    print("在职老师 %s" % t)


# 案例二:
# 元组中的数据一定不能改变,但是元组中的数据(可变类型)的数据可以改变
t1 = (1,2,'abc',True,(1,2))  # t1永远无法改变

t2 = (1,2,[])
print(t2,type(t2),id(t2),id(t2[2]))

t2[2].extend((10,20))
print(t2,type(t2),id(t2),id(t2[2]))

二、字典

特别了解:dict是python中仅存的mapping类型

1、声明

dict的key:可以为所有不可变类型(int  float  tuple  str  bool  None),一般采用字符串

dict的value:可以为所有数据类型

注:key具有唯一性(重复会覆盖旧值),value可以重复

dic = {1: None, None: None, 3.14: None,
       True: None, 'abc': None, (1,): None,
       None: 12345
       }
print(dic)

# 定义字典的三种方式

# 1

d1 = {'name':'Owen','age':18}

# 2

d2 = dict({'name':'Owen','age':18})

# 3

d3 = dict(name = 'Egon',age = 58)

字典存储数据是无序的,没有索引与切片,用key来取值

2、增删改查

dic = {}
# 增:key不存在
# 第一种
dic['name'] = 'Mac'
print(dic)
# 第二种:添加的参数字典,与dic可以重复,就是更新值,新key就是新增
dic.update({'a': 100, 'c': 300})
print(dic)

# 改:key已存在
dic['name'] = 'Big Mac'

# 查
print(dic['name'])

# 删
# 第一种
del dic['name']
print(dic)
# 第二种
res = dic.pop('c')  # 根据key删除指定对象,并返回删除的对象的value
print(res)

3、get取值(*****)

dic = {'a':10,'b':20}
# print(dic['c'])  # KeyError
res = dic.get('c')  # 拥有默认值,None,可以避免报错
print(res)
res = dic.get('d','key不存在')  # 可以自定义默认值
print(res)

# 随即删除,返回值是(key,value)
print(dic)
print(dic.popitem())
print(dic.popitem())
print(dic)


# 如何定义一个空字典
# 第一个参数:keys:list|tuple|str,第二个参数:统一的默认value
d10 = {}.fromkeys(['a','b','c'], '')
print(d10)  # {'a': '', 'b': '', 'c': ''}

# 独自设置默认值
d11 = {'a':10,'teas':['Owen']}

# 添加老师
# 如果有teas,在原teas基础上添加老师,如果没有,新建一个空teas
if 'teas' not in d11:
    d11['teas'] = []
d11['teas'].append('Egon')
d11['teas'].append('LiuXX')
print(d11)

# 原d11中,如果有teas这个key,setdefault相当于什么都没干
# 如果没有,就将第二个参数(默认值)传给teas存放到d11中
# 用setdefault实现上面的代码
d11.setdefault('teas',[])
d11['teas'].append('Egon')
d11['teas'].append('LiuXX')
print(d11)  #{'a': 10, 'teas': ['Owen', 'Egon', 'LiuXX']}

# 字典的定义:{} | dict()
# 字典的常用操作:增删改查
# 字典的内置方法:
# 字典的循环(迭代)
dic = {'a':10,'b':20,'c':30}
# 直接for循环(遍历)字典得到的是key
for k in dic:
    print(k,dic[k])

#或者使用.keys()方法得到存放key的集合
keys = dic.keys()
print(keys,type(keys))  # dict_keys(['a', 'b', 'c']) <class 'dict_keys'>

for k in keys:   # 遍历key,跟直接遍历字典是一样的
    print(k)

# 只循环值
values = dic.values()
print(values,type(values))  # dict_values([10, 20, 30]) <class 'dict_values'>

for v in values:  #遍历值
    print(v)


#存放key-value的键值对关系
K_vs = dic.items()
print(k_vs,type(k_vs)) # dict_items([('a', 10), ('b', 20), ('c', 30)]) <class 'dict_items'>
# 同时遍历k-v
for k,v in dic.items():
    print(k,v)
# dic.values() | dic.keys() | dic.items() 不是原生list,不能直接索引取值,但可以for循环取值

vs = list(values) #转为列表,按索引取值
print(vs[1])
for v in vs: # 循环取值
    print(v)


#多级字典嵌套
'''info1 = {
    "1":{"4":["aaa","bbb"]},
    "2":{"5":["ccc","ddd"]},
    "3":{"6":["eee","fff"]}
}
# info1["1"]["4"][1] = "ggg" #{'2': {'5': ['ccc', 'ddd']}, '1': {'4': ['aaa', 'ggg']}, '3': {'6': ['eee', 'fff']}}
# print(info1.keys())  #打印键值
# print(info1.values()) #打印有效值
info1.setdefault("4",{"7":["xxx","zzz"]}) #如果找到键值直接返回,没找到就插入后面的有效值
print(info1)  #{'4': {'7': ['xxx', 'zzz']}, '2': {'5': ['ccc', 'ddd']}, '3': {'6': ['eee', 'fff']}, '1': {'4': ['aaa', 'bbb']}}
print(info1)'''


# 案例: 不区分大小写,计算每一个名字出现的次数,记录在字典中
ls = ['Owen', 'owen', 'Egon', 'LiuXX', 'Liuxx', 'egon', 'egon']

# 第一种方法
name_dic = {}
for name in ls:
    # 名字全小写,不用区分大小写
    name = name.lower()
    # 名字是否在字典中存在:存在 - 次数+1 | 不存在 - 添加并设置初值1
    if name not in name_dic:
        #不存在
        name_dic[name] = 1
    else:
        #存在
        name_dic[name] += 1
print(name_dic)

# 第二种方法
name_dic = {}
for name in ls:
    name = name.lower()
    # name已存在,返回key的值;不存在,把key插入字典中,返回指定的默认值
    name_dic.setdefault(name,0)
    name_dic[name] += 1
print(name_dic)

三、集合

1、定义与声明

# 什么是set:
# i) 单列数据集合:str,list,tuple,set    双列:dict
# ii) 无序存储:无key无index,无法取值
# iii) 可变数据类型,内部可以存放任意类型数据,但数据具有唯一性 *****
# {}代表空字典,用set()来创建空集合
s1 = set()
print(s1,type(s1))  #set() <class 'set'>
s2 = set('abc')
print(s2,type(s2))  #{'b', 'a', 'c'} <class 'set'>

2、内置方法与使用——集合间的运算(& | ^ - > < ==)

p_set = {'a','b','c','egon'}  # {'a', 'c', 'b', 'egon'}
l_set = {'x','y','z','egon'}  #{'z', 'egon', 'x', 'y'}

# 交集 &
res = p_set & l_set
print(res)   # {'egon'}
res = p_set.intersection(l_set)
print(res)   # {'egon'}

# 并集
res = p_set | l_set
print(res)    #{'y', 'x', 'egon', 'c', 'z', 'b', 'a'}
res = p_set.union(l_set)
print(res)

# 差集:在p中不在l中
res = p_set - l_set
print(res)  #{'b', 'c', 'a'}
res = p_set.difference(l_set)
print(res)

# 对称差集:除去公共的部分
res = p_set ^ l_set
print(res)  # {'a', 'x', 'c', 'y', 'z', 'b'}
res = p_set.symmetric_difference(l_set)
print(res)

# 值更新的差集
print(p_set)  #{'c', 'egon', 'a', 'b'}
print(l_set)  #{'x', 'egon', 'z', 'y'}
p_set.difference_update(l_set)  # 将运算结果赋值给调用者
p_set = p_set - l_set
print(p_set)  # {'c', 'a', 'b'}  #原值已更新
print(l_set)  # {'egon', 'z', 'y', 'x'}


# 添加删除操作
s = set()
s.add('abc')  #添加一项
s.update('s','d','f')  #添加多项
s.add('xyz')
print(s)   #{'d', 'abc', 'xyz', 'f', 's'}

res = s.pop()  # 随机删除一个element元素,并将其返回
print(res)
if 'xyz' in s:
    s.remove('xyz')  # 有element删除,没有就抛异常
    print(s)  # {'abc', 's', 'f', 'd'}

#删除不存在的元素不会报错;返回None
s.discard('abc')  # {'d', 'f', 's'}
print(s)


list_1 = [1,4,5,7,3,6,7,9]
list_1 = set(list_1)        #转为集合去重,集合也是无序的
list_2 = set([2,6,0,66,22,8,4])
#子集
print(list_1.issubset(list_2))
#父集
print(list_1.issuperset(list_2))
#判断是否有交集
print(list_2.isdisjoint(list_1)) #如果两个集合没有交集,则返回True
# 了解:父子set
sup_set = {1, 2, 3, 4, 5}
sub_set = {1, 2, 3}
temp_set = {3, 2, 1}
flag_set = {7, 8, 9}

print(sup_set > sub_set)
print(sup_set < sub_set)
print(temp_set == sub_set)

# 两个set是否没有交集
res = flag_set.isdisjoint(temp_set)
print(res)
res = temp_set.isdisjoint(sup_set)
print(res)


# 案例与应用场景
# 选课
class_map = [
    ('owen', 'python'),
    ('egon', 'linux'),
    ('egon', 'python'),
    ('liuxx', 'python'),
    ('liuxx', 'java')
]

# 需求:
# 1.多少人参加了选课: ['owen', 'egon', 'liuxx']
# 2.都选了哪些课程: ['python', 'linux', 'java']

# 利用逻辑代码去重
names = []
for name,_ in class_map:
    #判断列表中是否存在,不存在就添加
    if name not in names:
        names.append(name)
print(names)   #['owen', 'egon', 'liuxx']

# 利用集合去重
classes = set()
for _,cless in class_map:
    classes.add(cless)
print(classes)  #{'java', 'linux', 'python'}

猜你喜欢

转载自blog.csdn.net/weixin_40406241/article/details/88808376