zoukankan      html  css  js  c++  java
  • 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('33[34;10m define set  ,集合是无序序列,不支持索引取值 33[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(
    '''33[34;10m
    ########################################################################################
    #
    #                   set 常用方式
    #
    ########################################################################################
    33[34;0m ''')
    
    
    print('33[34;10m in 和 not in 33[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('33[34;10m |   union 并集 :所有报名的学生集合 (去掉重复的)33[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('33[34;10m   &  isinstance 交集 :两个共同的元素 33[34;0m')
    
    # &  isinstance 交集 :两个共同的元素
    
    print(pythons & linuxs)     # 符号 & 是操作集合的交集,就是共同的元素  {'gandan', 'wupeiqi'}
    print(pythons.intersection(linuxs))     # 内部提供 intersection 方法 等同于 符号 & 操作 {'gandan', 'wupeiqi'}
    
    
    # - difference  差集 :求只报名python,没有报名linux 的学生
    print('33[34;10m   - difference  差集 :求只报名python,没有报名linux 的学生 33[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('33[34;10m   ^ symmetric_difference 对称差集 两个集合bu共有的 33[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('33[34;10m == 33[34;0m')
    
    set1 = {1,2,3}      # 顺序不一样,元素一样
    set2 = {3,2,1}      # # 顺序不一样,元素一样
    
    print(set1 == set2 )    #  return bool 
    
    
    #  > , >= , < , <= ,  父集 子集 
    print('33[34;10m == 33[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('33[34;10m set 集合是可变类型,但其元素一定是不可变类型 33[34;0m')
    
    
    linuxs = {'wupeiqi','oldboy','gandan'}      # set 集合是可变类型,但其元素一定是不可变类型
    
    linuxs.add('asb')               # 支持添加元素
    print(linuxs)                   # {'asb', 'oldboy', 'wupeiqi', 'gandan'} 可变但无序
    
    
    
    
    # pop 随机删除不需要参数,有返回值的
    print('33[34;10m pop 随机删除不需要参数,有返回值的33[34;0m')
    
    ret = linuxs.pop()              # 不需要指定参数,随机删除,有返回值的,不然不知道搞的那个
    print(ret)                      # 返回被pop的值
    
    
    
    # pop 随机删除不需要参数,有返回值的
    print('33[34;10m pop 随机删除不需要参数,有返回值的33[34;0m')
    '''
    ret = linuxs.remove('wupeiqi')          #   指定删除存在的元素,单纯的删除,没有返回值。
    print(ret)                              # None
    
    ret = linuxs.remove('peiqi')          #   指定删除元素不存的报错 KeyError,单纯的删除,没有返回值。
    print(ret)                              # None
    '''
    
    
    # discard 指定删除元素,不存在的不报错
    print('33[34;10m discard 指定删除元素,不存在的不报错 33[34;0m')
    
    ret = linuxs.discard('peiqi')          #   指定删除元素不存的不报错 ,单纯的删除,没有返回值。
    print(ret)                              # None
    
    
    
    
    
    
    
    print(
    '''33[34;10m
    ########################################################################################
    #
    #                   set 了解的方法
    #
    ########################################################################################
    33[34;0m ''')
    
    
    # update 更新
    print('33[34;10m  update 更新 33[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('33[34;10m  clear 清除 33[34;0m')
    
    new_set.clear()             # clear new_set
    print(new_set)              # set() 空集合
    
    
    
    # copy 复制 
    print('33[34;10m  copy 复制 33[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 常用方式
    #
    ########################################################################################
     
     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'}
    结果哦

    练习题:

    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

     解答

    #!/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('33[34;10m first in first out 33[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('33[34;10m first in last out 33[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:字符串,列表,元组,字典,集合

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

      

  • 相关阅读:
    窗口参数Hello Win32 之疯狂注释版
    返回代码hdu 2054 A==B?
    function类html5游戏开发零基础开发《圣诞老人送礼物》小游戏
    路径工程OpenCV依赖文件路径自动添加方法
    变形测试数据HDU1181:变形课(DFS)
    类参数Hello MFC 之疯狂注释版
    按钮保存ios学习之xcode到处ipa安装包
    clientapivc api TCP&UDP—helloworld
    文件下载Asp.net下载文件的实例
    选择代码在Ubuntu12.04.2上使用Xmonad窗口管理器(续)
  • 原文地址:https://www.cnblogs.com/liushubao/p/7460183.html
Copyright © 2011-2022 走看看