6 元组和集合类型
元组(tuple)
为何要有元组?===>存多个值,对比列表来说,元组不可变,主要是用来读
定义:与列表类型相似,只不过[]换成(),元组是不可变类型所以可以当做字典的key
常用方法:
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Time : 2017/08/31 # @Author : tony # @File : tuple_set # @Version : 1.0 # 弄个tuple尝尝 t = ('tony',28,'male',['a','b','c'],('e','f','g')) # () 定义 tuple ,此序列的元素一旦定了不可改变,元素的类型不限制。 print(t) # ('tony', 28, 'male', ['a', 'b', 'c'], ('e', 'f', 'g')) print(type(t)) # <class 'tuple'> ############################################################## # # 元组所以可以当做字典的key dict 的 key 必须是不可变类型 ############################################################## d = {(1,):'tony'} # 如果tuple里面就一个元素,记得用逗号结尾 print(d) # {(1,): 'tony'} print(type(d)) # <class 'tuple'> print(d[(1,)]) # 'tony' # tuple index goods = ('iphone','Thinkpad','sanxing','sony') print('iphone' in goods) # return bool #goods[1] = 'huawei' # tuple 元素不支持修改,硬来的话 #print(goods) # TypeError: 'tuple' object does not support item assignment # tuple items 可以是 可变元素 , 这样就可操作元素的元素 t = (1,2,3,['a','b','c']) # 内部元素是可变的类型 t[3][0] = 'A' # 操作元素的可变类型元素 print(t) # (1, 2, 3, ['A', 'b', 'c']) t[3].append(0) # 操作元素的元素(元素是可变类型) print(t) # (1, 2, 3, ['A', 'b', 'c', 0]) for k in enumerate(t): # enumerate() 返回序的元素和元素的下标 每一组用tuple 包起来 print(k) # (0,1) (1,2),(2,3),(3,['a','b','c']) print(k[1]) #
集合(set)
集合:可以包含多个元素,用逗号分割
作用:去重,关系运算
集合的元素遵循三个原则:
1、集合是可变类型但每个元素必须是不可变类型
2、没有重复的元素
3、无序
注意:集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
定义:
PS: s = {'tony','Tony'}
重点及方法:
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Time : 2017/09/01 # @Author : tony # @File : set_ # @Version : 1.0 print('\033[34;10m define set ,集合是无序序列,不支持索引取值 \033[34;0m') # define set 集合是无序序列 ,不支持索引取值 s = {1,2,3,'a','b','c',(4,5,6,7)} # {} 像 dict 一样包起来,不同的是不用Key value 的形式 print(s) # {1, 2, 3, 'c', 'b', 'a', (4, 5, 6, 7)} print(type(s)) # <class 'set'> print( '''\033[34;10m ######################################################################################## # # set 常用方式 # ######################################################################################## \033[34;0m ''') print('\033[34;10m in 和 not in \033[34;0m') # in 和 not in pythons = {'tony','alex','egon','wupeiqi','yuanhao','gandan','biubiu'} # define set linuxs = {'wupeiqi','oldboy','gandan'} # defind set print('tony' in pythons) # return bool print('\033[34;10m | union 并集 :所有报名的学生集合 (去掉重复的)\033[34;0m') # | union 并集 :所有报名的学生集合 (去掉重复的) print(pythons|linuxs) # 符号 | 操作并集 两集合并在一起生 {'gandan', 'oldboy', 'alex', 'wupeiqi', 'biubiu', 'egon', 'yuanhao', 'tony'} # 去掉重复的 print(pythons.union(linuxs)) # 内部提供union方法 等同于 符号 | 操作 {'gandan', 'oldboy', 'alex', 'wupeiqi', 'biubiu', 'egon', 'yuanhao', 'tony'} print('\033[34;10m & isinstance 交集 :两个共同的元素 \033[34;0m') # & isinstance 交集 :两个共同的元素 print(pythons & linuxs) # 符号 & 是操作集合的交集,就是共同的元素 {'gandan', 'wupeiqi'} print(pythons.intersection(linuxs)) # 内部提供 intersection 方法 等同于 符号 & 操作 {'gandan', 'wupeiqi'} # - difference 差集 :求只报名python,没有报名linux 的学生 print('\033[34;10m - difference 差集 :求只报名python,没有报名linux 的学生 \033[34;0m') print(pythons - linuxs) # - 符号操作集合 差集 :求只报名python,没有报名linux 的学生 {'tony', 'biubiu', 'yuanhao', 'egon', 'alex'} print(pythons.difference(linuxs)) # 内部difference方法求差集 {'tony', 'biubiu', 'yuanhao', 'egon', 'alex'} # ^ symmetric_difference 对称差集 就是两个集合bu共有的 ,我有你没有的,你有我没有的 print('\033[34;10m ^ symmetric_difference 对称差集 两个集合bu共有的 \033[34;0m') print(pythons ^ linuxs) # ^ 符号操作集合 对称差集 不共有的, 我有你没有的,你有我没有的 {'oldboy', 'tony', 'yuanhao', 'alex', 'egon', 'biubiu'} print(pythons.symmetric_difference(linuxs)) # 内部方法 symmetric_difference 方法 求对称差集 {'oldboy', 'tony', 'yuanhao', 'alex', 'egon', 'biubiu'} ##################################################################################################################################################### print('#'*80) # == print('\033[34;10m == \033[34;0m') set1 = {1,2,3} # 顺序不一样,元素一样 set2 = {3,2,1} # # 顺序不一样,元素一样 print(set1 == set2 ) # return bool # > , >= , < , <= , 父集 子集 print('\033[34;10m == \033[34;0m') set3 = {1,2,3,4,5} set4 = {2,3,5} print(set3 >= set4) # 符号操作 set3 包含set4 return bool print(set3.issuperset(set4)) # set 内置方法 issuperset , return bool print(set4 <= set3) # 符号操作,set4 是否是set3的子集合 return bool print(set4.issubset(set3)) # set 内置方法 issubset , set4 是否是set3的子集合 return bool # set 集合是可变类型,但其元素一定是不可变类型 print('\033[34;10m set 集合是可变类型,但其元素一定是不可变类型 \033[34;0m') linuxs = {'wupeiqi','oldboy','gandan'} # set 集合是可变类型,但其元素一定是不可变类型 linuxs.add('asb') # 支持添加元素 print(linuxs) # {'asb', 'oldboy', 'wupeiqi', 'gandan'} 可变但无序 # pop 随机删除不需要参数,有返回值的 print('\033[34;10m pop 随机删除不需要参数,有返回值的\033[34;0m') ret = linuxs.pop() # 不需要指定参数,随机删除,有返回值的,不然不知道搞的那个 print(ret) # 返回被pop的值 # pop 随机删除不需要参数,有返回值的 print('\033[34;10m pop 随机删除不需要参数,有返回值的\033[34;0m') ''' ret = linuxs.remove('wupeiqi') # 指定删除存在的元素,单纯的删除,没有返回值。 print(ret) # None ret = linuxs.remove('peiqi') # 指定删除元素不存的报错 KeyError,单纯的删除,没有返回值。 print(ret) # None ''' # discard 指定删除元素,不存在的不报错 print('\033[34;10m discard 指定删除元素,不存在的不报错 \033[34;0m') ret = linuxs.discard('peiqi') # 指定删除元素不存的不报错 ,单纯的删除,没有返回值。 print(ret) # None print( '''\033[34;10m ######################################################################################## # # set 了解的方法 # ######################################################################################## \033[34;0m ''') # update 更新 print('\033[34;10m update 更新 \033[34;0m') new_set = {'alex_SB','seven'} print(linuxs.update(new_set)) # 更新 linuxs set print(linuxs) # {'wupeiqi', 'seven', 'oldboy', 'asb', 'alex_SB'} print(new_set.update(linuxs)) # 反过来更新也行 print(new_set) # {'wupeiqi', 'seven', 'oldboy', 'asb', 'alex_SB'} # clear 清除 print('\033[34;10m clear 清除 \033[34;0m') new_set.clear() # clear new_set print(new_set) # set() 空集合 # copy 复制 print('\033[34;10m copy 复制 \033[34;0m') new_set1 = linuxs.copy() # copy set print('old:{0},copy:{1}'.format(linuxs,new_set1)) # old:{'alex_SB', 'gandan', 'seven', 'asb', 'wupeiqi'},copy:{'alex_SB', 'seven', 'gandan', 'wupeiqi', 'asb'
文件执行结果
define set ,集合是无序序列,不支持索引取值 {1, 2, 'c', 3, 'a', 'b', (4, 5, 6, 7)} <class 'set'> ######################################################################################## # # set 常用方式 # ######################################################################################## in 和 not in True | union 并集 :所有报名的学生集合 (去掉重复的) {'alex', 'tony', 'oldboy', 'biubiu', 'egon', 'yuanhao', 'gandan', 'wupeiqi'} {'alex', 'tony', 'oldboy', 'biubiu', 'egon', 'yuanhao', 'gandan', 'wupeiqi'} & isinstance 交集 :两个共同的元素 {'gandan', 'wupeiqi'} {'gandan', 'wupeiqi'} - difference 差集 :求只报名python,没有报名linux 的学生 {'biubiu', 'tony', 'egon', 'yuanhao', 'alex'} {'biubiu', 'tony', 'egon', 'yuanhao', 'alex'} ^ symmetric_difference 对称差集 两个集合bu共有的 {'tony', 'biubiu', 'egon', 'alex', 'oldboy', 'yuanhao'} {'tony', 'biubiu', 'egon', 'alex', 'oldboy', 'yuanhao'} ################################################################################ == True == True True True True set 集合是可变类型,但其元素一定是不可变类型 {'asb', 'oldboy', 'gandan', 'wupeiqi'} pop 随机删除不需要参数,有返回值的 asb pop 随机删除不需要参数,有返回值的 discard 指定删除元素,不存在的不报错 None ######################################################################################## # # set 了解的方法 # ######################################################################################## update 更新 None {'oldboy', 'alex_SB', 'seven', 'gandan', 'wupeiqi'} None {'wupeiqi', 'oldboy', 'seven', 'alex_SB', 'gandan'} clear 清除 set() copy 复制 old:{'oldboy', 'alex_SB', 'seven', 'gandan', 'wupeiqi'},copy:{'wupeiqi', 'oldboy', 'seven', 'alex_SB', 'gandan'}
练习题:
1、有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日赋值给不同的变量 2、模拟队列 模拟堆栈 3、有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值} 4、统计s='hello alex alex say hello sb sb'中每个单词的个数 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
解答
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Time : 2017/09/01 # @Author : tony # @File : set_prctice # @Version : 1.0 import time ############################################################## # # 练习题 # ############################################################## # 一 有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日赋值给不同的变量 data = ['alex',49,[1900,3,18]] # 列表解压 name,age,birth = data year,month,day = birth print('name:{0} age:{1} Date of Birth :{2}-{3}-{4}'.format(name,age,year,month,day)) # name:alex age:49 Date of Birth :1900-3-18 # 扩展列表解压 l1 = ['tony',28,'male','tel'] #name,age,sex = l1 # 解压的元素的个数要跟变量的个数一致,不然报错 ValueError: too many values to unpack (expected 3) #print(name,age,sex) # 万能 * 号 解决 多的元素 list1 = [1,2,3,4,5,6,7,8,9] a,b,*c ,d = list1 print(a) # 1 print(b) # 2 print(c) # [3,4,5,6,7,8] print(d) # 9 # 二 模拟队列 # 模拟堆栈 # first in first out print('\033[34;10m first in first out \033[34;0m') queue_l = [] # 模拟队列 for k in range(10): queue_l.append(k) # 追加到最后一个 print(queue_l) print('{0} in queue'.format(k)) time.sleep(0.5) for i in range(len(queue_l)): queue_l.pop(0) # 默认弹出最后一个 pop(-1),先进入的在最前 所以改参数 print(queue_l) print('{0} out queue '.format(i)) time.sleep(0.5) # first in last out print('\033[34;10m first in last out \033[34;0m') for k in range(10): queue_l.append(k) # 追加到最后一个 print(queue_l) print('{0} in queue'.format(k)) time.sleep(0.5) for i in range(len(queue_l)): queue_l.pop() # 默认弹出最后一个 pop(-1), so last in first out print(queue_l) time.sleep(0.5) # 三 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 l = [11,22,33,44,55,66,77,88,99,90] dic = {'k1':[],'k2':[]} # Dict Have key Value # 第一种: for k in l: if k > 66: dic['k1'].append(k) else: dic['k2'].append(k) print(dic) # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]} # 第二种 dict1 = {} # Dict Not Have key Value for k in l: if k > 66: dict1.setdefault('k1',[]).append(k) # setdefault 字典中有key 返回 Value ,没有key 直接添加,默认 Value None else: dict1.setdefault('k2',[]).append(k) # 直到没有当前的key ,直接添加的时,跟上value 即可 print(dict1) # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]} # 统计没有单词出现的次数 key,Value 的形式 ''' s='hello alex alex say hello sb sb'中每个单词的个数 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2} ''' s = 'hello alex alex say hello sb sb ' word_count = {} s = s.split() # split 分割开 返回一个list ['hello', 'alex', 'alex', 'say', 'hello', 'sb', 'sb'] for k in s: if k in word_count: word_count[k] += 1 # 有当期的单词 个数加 1 else: word_count[k] = 1 # 没有当前的单词,建立新的key Value 为 1 说明第一次遇到这货 print(word_count)
小知识点:
in:字符串,列表,元组,字典,集合
for:字符串,列表,元组,字典,集合
解压:字符串,列表,元组,字典,集合