zoukankan      html  css  js  c++  java
  • Python-集合

    集合是一种重要的数据类型,最主要的特点是天生去重。

    一、在介绍集合之前,先介绍一下深拷贝和浅拷贝。

    深拷贝:会重新开辟一个内存空间

    浅拷贝:不会重新开辟内存空间

    (1)我们看下面的例子:

    l = [1,1,2,3,4,5,6,8]
    for i in l:
        if i%2!=0:#奇数删掉。每删掉一个,下标就会变一次
            l.remove(i)
    print(l)

    可以看出,这段代码想实现的功能是去除list里的基数,但是运行结果如下:

    原因就是,每删除掉一个数,列表中元素的下标就会变化一次,但是i是一直增加的,导致达不到我们想要的效果。

    (2)这个问题可以用下面的方法解决:

    l = [1,1,2,3,4,5,6,8]
    l2 = [1,1,2,3,4,5,6,8]
    print('l内存地址为:',id(l))
    print('l2内存地址为:',id(l2))
    for i in l2:#l2下标不会变化,因此所有元素都可以取到
        if i%2!=0:
            l.remove(i)#在l中删除对应的元素
    print(l)

    我们先看运行结果:

    可以看到,这样能够去除list里的奇数。定义一个list l2,则为l2重新开辟了一个内存空间,这样删除l中的元素时,l2不受影响。

    (3)那么有人会想,直接定义l2=l是不是也可以,答案是不可以。因为这样的话,l和l2指向了同一个内存地址,l发生变化,l2也会变化。

       

    (4)用(2)中的方法可以解决这个问题,但是当list很长时,复制一遍很麻烦,容易发生错误,这时可以引入copy模块

    可以看到,在l中增加元素,不会影响l2。

      

    二、集合set

    集合的特点:(1)去重;(2)无序的;(3)集合也用大括号{},和字典不同的是:集合里直接是元素,字典是key-value的格式。(4)集合可以取交集、并集、差集等。

    1、集合的定义

    集合有两种定义方法,用set()或者{}。下面的例子能够很好地看出集合的去重和无序特点。

      

    2、交集、并集、差集、对称差集

    (1)交集:两个集合相同的元素,用‘&’

    下面例子中,s1中包含元素3,4,5,6,7,8,9,s2中包含元素1,2,3,4。相同的部分是3,4。

    另外,不同类型的取交集,结果为空。

      

    isdisjoint可以判断两个集合是否有交集,有交集返回False,没有交集返回True

      

    (2)并集:把两个集合合并到一起,并去重,用‘|’或者union

      

    (3)差集:取一个集合里有,另一个集合里没有的元素,用‘-’或者difference

    s1 - s2,取s1里有,但是s2里没有的元素。

       

      

    (4)对称差集:去掉2个集合里都有的元素。用'^'

      

    3、集合的增删改查

    4、小练习

    输入密码,校验密码是否合法。密码必须包含大写字母、小写字母、数字和特殊符号。

    import string
    nums_set = set(string.digits)#所有数字组成的集合
    upper_set = set(string.ascii_uppercase)#所有大写字母组成的集合
    lower_set = set(string.ascii_lowercase)#所有小写字母组成的集合
    pun = set(string.punctuation)#所有特殊符号组成的集合
    for i in range(5):
        pwd=input('请输入密码:').strip()
        pwd_set = set(pwd)
        if pwd_set & nums_set and pwd_set & upper_set and pwd_set & lower_set and pwd_set & pun:
            print('密码是合法的',pwd)
        else:
            print('密码必须包含大写字母、小写字母、数字和特殊字符')
  • 相关阅读:
    MybatisPlus自动填充公共字段的策略
    docker内的应用访问宿主机上的mysql和Redis
    Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
    集群中的session共享问题解决方案
    Java并发之原子性,有序性,可见性,以及Happen-Before原则
    Java NIO技术概述
    Java反射机制总结
    java线程以及定时任务
    java流概述以及文件读写示例
    CSS常用内容总结(二)
  • 原文地址:https://www.cnblogs.com/zhxwind/p/8780874.html
Copyright © 2011-2022 走看看