zoukankan      html  css  js  c++  java
  • python 集合(set)和字典(dictionary)的用法解析

    Table of Contents generated with DocToc

    ditctaionary and set

    hash 介绍

      hash是计算机中非常常见一种查找的手法,它可以支持常数时间的insert、remove、find,但是对于findMin、findMax、sort等操作就支持的不是很好,具体是为什么呢;

      hash其实是通过key来找value的,可以这样简单的理解为value都被存在一个数组之中,每次你用key计算一下可以得到相应数组的下标,即 index=f(key) 是不是一下子就找到元素所在位置了呢!

    集合-set

      集合(set)是一类容器,元素没有先后顺序,并且元素的值不重复。
      集合的字面量用花括号{}
    eg:

    • {1,5,7}
    • {'apple', 'orange', 'pear', 'banana'}

    创建

    • 直接给变量赋值一个集合字面量
      fruit = {'apple', 'orange', 'pear', 'banana'}

    • 使用set()创建一个空集合
      emp = set()
      注:emp = {} #创建一个空字典

    • 使用set()将列表或元组转换成集合
      prime = set([1,3,5,7,11])
      结果是:
      {1, 3, 5, 7, 11}

    操作和访问集合的元素

    可以用add()和remove()添加和删除集合元素
    可以用min()、max()、len()和sum()对集合操作。
    集合内的元素是无序的,所以不能像列表那样通过下标来访问集合元素。

    • 用循环实现遍历集合中的各个元素
    s = {2,3,5,7,11}
    for i in s:
        print(i,end='')
    #输出:
    #235711
    
    • 运算符in和not in 用于判断某个元素是否在集合中。
    s = {2,3,5,7,11
    print(5 in s)
    print(4 not in s)
    输出:
    True
    True
    

    子集、超集、相对判断

    • 如果集合s1中的元素,同样都在集合s2中,则称s1为s2的子集,s2为s1的超集。
      使用s1.issubset(s2)来判断s1是否为s2的子集。
      使用s2.issuperset(s1)来判断s1是否为s2的超集。
    s1 = {2,3,5,7}
    s2 = {1,2,3,4,5,6,7}
    print(s1.issubset(s2))
    print(s2.issuperset(s1))
    输出:
    True
    True
    
    • 使用关系运算符==和!=
      - 判断2个集合包含的元素完全相同与否。

    • 使用关系运算符<,<=,>,>=。
      - 如果s1是s2的真子集,则s1<s2是True
      - 如果s1是s2的子集,则s1<=s2是True
      - 如果s1是s2的真超集,则s1>s2是True
      - 如果s1是s2的超集,则s1>=s2是True
      - 注:s1是s2的真子集的意思是s1是s2的子集,但是s2中至少有一个s1中不存在的元素; s1是s2的真超集的意思是s1是s2的超集,但是s1中至少有一个s2中不存在的元素。

    • 通过集合的函数或运算符进行集合的并集、交集、差集和对称差的集合运算。

    运算 函数 运算符 说明
    并集 union() | 同数学中的并集
    交集 intesection() & 同数学交集
    差集 difenrence() - s1-s2出现在s1不出现在s2
    对称差 symmertric_diference() ^ s1^s2=s1

    字典-dictionary (map)

      字典是一个用“键”做索引来存储的数据的集合。一个键和它所对应的数据形成字典中的一个条目。字典的key是用来做hash运算的,需要不可变对象,如数字、字符串、元组;可变的对象不可以作为key,如list、dictionary、set

    创建字典

    • 用花括号{ } 来表示,每个元素用冒号分隔键和数据。可以用{}或者dict()来创建空字典。
    students = {3180101:’张三’, 3180102:’李四’, 3180105:’王五’, 3180110:’赵六’}
    d={'math': '0001', 'python': '0002', 'c': '0003'}
    
    d=dict([("math","0001"),("python","0002"),("c","0003")])
    
    d=dict(math="0001",python="0002",c="0003")
    
    

    字典的基本运算

    • 访问和修改条目
      直接用[ ]运算符,用<字典> [键]的形式,访问键所对应的数据。
    score = {'张三':78, '李四':92}
    print(score['张三'])#访问score中键为'张三'的数据
    score['李四'] = 89#把score中键为'李四'的数据修改为89
    score['王五'] = 100#score中没有键为‘王五’的元素,则增加一项,键为’王五’,数据为100。
    print(score)
    输出:
    78
    {'张三': 78, '李四': 89, '王五': 100}
    
    • 删除条目
      del dictName[key]
      如果key不存在,会抛出KeyError异常

    • 遍历字典

    # 循环
    score = {'张三':78, '李四':92, '王五':89}
    for name in score:
        print(name + ':' + str(score[name]))
    
    #用items()
    for key,value in score.items():
       print(key + ':' + str(value))
    输出:
    张三:78
    李四:92
    王五:89
    
    • 字典的大小len()

    • 检测,in 和not in检测key是否在字典中

    • 用==和!=比较2个字典是否相同(键和值都相同)

    • 字典常用函数

    函数 说明
    keys() 返回由全部key组成的序列
    values() 返回由全部值组成的序列
    items() 返货一个序列,每一项都是一个tuple,(key,value)
    clear() 删除所有条目
    get(key,value) 返回这个键所对应的值,如找不到返回value
    pop(key) 返回这个键所对应的值,同时删除这个条目

    可变对象和不可变对象

    可变对象和不可变对象是Python语言的核心概念。

    • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
    • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址。
    • 不可变数据类型创建不可变对象,可变数据类型创建可变对象
    • 可变类型有:列表、集合、字典
    • 不可变类型有:整数、浮点数、复数、字符串、逻辑量(True False)、元组
    • 不同数据类型对象和逻辑值的变换
      数据类型 True False
      整数 非0 0
      浮点数 非0 0.0
      复数 非0 0+0j
      字符串 非空 ""
      逻辑量 True False
      列表 非空 []
      元组 非空 ()
      集合 非空 set()
      字典 非空 {}

    应用

    set

    • 列表去重
    #去重,但不能保证保持原有顺序
    mailto = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
    addr_to =list(set(mailto))
    print(addr_to)
    #result ['shafa', 'cc', 'sss', 'afa', 'bbbb']
    #排序后保证保持原有顺序
    addr_to.sort(key = mailto.index)
    print(addr_to)
    #result ['cc', 'bbbb', 'afa', 'sss', 'shafa']
    

    找鞍点

    n=int(input())
    a=[]
    for i in range(0,n):
          b=input().split()
          a.insert(i,b)
    c=[]
    d=[]
    for i in range(0,n):
        maxa=max(int(a[i][j]) for j in range(n))
        mina=min(int(a[k][i]) for k in range(0,n))
        c+=[(i,j) for j in range(n) if int(a[i][j])==maxa]
        d+=[(k,i) for k in range(n) if int(a[k][i])==mina]
    c=list(set(c)&set(d))
    if (c!=[]):
       print(c[0])
    else:
       print("NONE")
    

    dictionary

    • 字典替代分支语言
    #输入一个1到7的数字,输出对应的星期名的缩写
    days={1:"Mon",2:"Tue",3:"Wed",4:"Thu",5:"Fri",6:"Sat",7:"Sun"}
    num=int(input())
    print(days[num])
    
    result={"+":"x+y","-":"x-y","*":"x*y","/":'''x/y if y!=0   
            else "divided by zero"'''}
    x=int(input())
    z=input().strip()
    y=int(input())
    r=eval(result.get(z))#计算表达式的值
    if type(r)!=str:
        print(format(r,'.2f'))
    else:
        print(r)
    
    
    • 字典计数

    eg:1

    #输入一行字符,求字符”a”,”b”和”c”出现的次数
    
    diccount={char:0 for char in "abc"}   #字典初始化
    s=input()
    lst=[char for char in s if  
          ord("a")<=ord(char)<=ord("c")]
    for char in lst:
        diccount[char]+=1
    print(diccount)
    
    

    eg2:

    #输入一行字符,求每个字符出现的次数
    #建字典dicchar,键是字符,值是字符出现的次数。由于不能预知出现哪些字符,所以不能预先初始化字典
    #注意字典的get函数:get() 函数返回指定键的值,如果值不在字典中返回默认值。countchar.get(c,0)函数返回键为c的值, 不在字典中返回0。
    
    str=input()
    countchar={}
    
    for c in str:
        countchar[c]=countchar.get(c,0)+1
    print(countchar)
    
    

    eg:

    #求列表中两数之和等于指定数的下标
    '''
    Given nums = [2, 11,7, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 2].
    '''
    nums = [2, 6, 11, 15,7,8]
    target = 9
    
    
    hm = dict()
    for i in range(len(nums)):
        if nums[i] in hm:
            print(hm[nums[i]], i)
            break
        hm[target - nums[i]] = i
    print([2, 6, 11, 15,7,8])
    print(hm)
    
    • 字典列表嵌套
    books=[
            {"name":u"C#从入门到精通","price":25.7,"store":u"卓越"},
            {"name":u"ASP.NET高级编程","price":44.5,"store":u"卓越"},
            {"name":u"Python核心编程","price":24.7,"store":u"当当"},
            {"name":u"JavaScript大全","price":45.7,"store":u"当当"},
            {"name":u"Django简明教程","price":26.7,"store":u"新华书店"},
            {"name":u"深入Python","price":55.7,"store":u"新华书店"},
          ]
    
    print(min([item["price"] for item in books ]))
    #24.7
    books[0]['name']
    #C#从入门到精通
    
    • 字典嵌套
    users = {'aeinstein': {'first': 'albert',
                           'last': 'einstein',
                           'location': 'princeton'},
             'mcurie': {'first': 'marie',
                        'last': 'curie',
                        'location': 'paris'},
             }
    
    for username, user_info in users.items():
        print("
    Username: " + username)
        full_name = user_info['first'] + " " + user_info['last']
        location = user_info['location']
    
        print("	Full name: " + full_name.title())
        print("	Location: " + location.title())
        '''
    Username: aeinstein
    Full name: Albert Einstein
    Location: Princeton
    
    Username: mcurie
    Full name: Marie Curie
    Location: Paris
        '''
    
    • 图和字典
    # %% 求图的顶点数,边数,边的总长  空字典{},空集合 set()
    d={"start": {1:1,2:2,3:4},  #第一个点为“start”,一条边指向1,长度为1,一条指向2,长度为2,一条指向3,长度为4
       1:{3:5},
       2:{"end":8,3:78},
       3:{2:4,"end":8},
       "end":{}   }
    v=set();     e=set()    ;s=0           #顶点的集合,边点的集合
    for key,value in d.items():
        v.add(key)
        if type(value)==dict:
            for key1,value1 in value.items():
                v.add(key1)
                e.add((key,key1))
                s+=value1
    
    print(len(v),len(e),s)
    #5 8 110
    
    • 组装字典
    id = "IAD"
    location = "Dulles Intl Airport"
    max_temp = 32
    min_temp = 13
    precipitation = 0.4
    
    
    print("{id:3s} : {location:19s} : {max_temp:3d} / {min_temp:3d} /{precipitation:5.2f}".format(
       id=id, location=location, max_temp=max_temp,
       min_temp=min_temp, precipitation=precipitation))
    
    data = dict(
           id=id, location=location, max_temp=max_temp,
           min_temp=min_temp, precipitation=precipitation
           )
    print("{id:3s} : {location:19s} : {max_temp:3d} / {min_temp:3d} /{precipitation:5.2f}".format_map(data))
    
    #IAD : Dulles Intl Airport :  32 /  13 / 0.40
    #IAD : Dulles Intl Airport :  32 /  13 / 0.40
    #date={'id': 'IAD', 'location': 'Dulles Intl Airport', 'max_temp': 32, 'min_temp': 13, 'precipitation': 0.4}
    

    参考文档

    [python官方文档]https://docs.python.org/3.8/library/stdtypes.html#set-types-set-frozenset

    注:如有侵权联系作者删帖

    blogs record our growth
  • 相关阅读:
    Linux设备驱动第六篇:高级字符驱动操作之iotcl
    Stack的三种含义
    用vs2013+velt-0.1.4进行嵌入式开发 进行海思平台 UBOOT 开发
    学会思考技术背后的那些思想和本质
    Rails 4.0.0 开发环境一切正常,到生成环境发现 无法找到 css 和 js
    一加手机,迟到的惊喜
    附近的人计算方法-----使用mysql脚本计算方法
    如何将Superset嵌入后台系统之实践
    这里是纯干货!2018年深度学习的10个发展预测
    这里是纯干货!2018年深度学习的10个发展预测
  • 原文地址:https://www.cnblogs.com/qwfand/p/12627393.html
Copyright © 2011-2022 走看看