6 元组和集合类型

时间:2022-09-11 20:47:08

元组(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'

文件执行结果

 

6 元组和集合类型6 元组和集合类型
 define set  ,集合是无序序列,不支持索引取值 
{
1, 2, 'c', 3, 'a', 'b', (4, 5, 6, 7)}
<class 'set'>

########################################################################################
#
#
set 常用方式
#
#
#######################################################################################

innot 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'}
结果哦

 

练习题:

 

6 元组和集合类型6 元组和集合类型
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}
View Code

 

 解答

 

6 元组和集合类型6 元组和集合类型
#!/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)
View Code

 

 

小知识点:

in:字符串,列表,元组,字典,集合

for:字符串,列表,元组,字典,集合

解压:字符串,列表,元组,字典,集合