zoukankan      html  css  js  c++  java
  • python集合类型

    集合类型简介

    集合也是容器,其内元素都是无序、唯一、不可变的。它常用来做成员测试、移除重复数据、数据计算(比如交集、并集、差集)。

    集合Set是dict的无value版。集合也使用大括号包围:

    >>> s = {'a','b','c'}
    >>> type(s)
    <class 'set'>
    

    Set中的元素和dict一样也是通过hash值来存储的:将元素hash()得到hash值,存储到Set中。所以,Set中的元素必须是不可变数据(例如列表不能放进集合中)。但集合自身是可变的,可以修改其中的元素。此外,python提供了另一种不可变的集合类型frozenset。

    使用大括号或set()构造方法可以构造集合。

    s = {'a','b','c'}
    s = set("abc")
    s = frozenset("abc")
    

    需要注意的是,空的{}表示的字典,而不是集合,如果想要构造空集合,可以使用不带参数的set()来构造。

    由于集合是通过hash值来存储的,没有位置索引。所以没法对集合进行单元素的检索,只能对集合进行修改操作,或迭代、遍历。

    集合运算操作

    >>> x = set("abcde")
    >>> y = set("defgh")
    >>> z = set("opq")
    >>> x
    {'b', 'e', 'c', 'a', 'd'}
    >>> y
    {'e', 'h', 'f', 'g', 'd'}
    

    集合的运算有交集、并集、差集等操作。它们都有两种方式:操作符号版的,方法函数版的。符号版的都只能集合对集合,函数版的可以集合和其它比较,比如列表。

    交集&或intersection()方法:

    >>> x & y
    {'e', 'd'}
    
    >>> x.intersection(y)
    {'e', 'd'}
    
    >>> x & ["a", "c"]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unsupported operand type(s) for &: 'set' and 'list'
    
    >>> x.intersection(["a","c"])
    {'c', 'a'}
    

    并集|或union()方法:

    >>> x | y
    {'b', 'e', 'h', 'c', 'a', 'f', 'g', 'd'}
    >>> x | y | z
    
    >>> x.union(y)
    >>> x.union(["x", "y"])
    >>> x.union(["x", "y"], ["o", "p"])
    

    差集-或difference():

    >>> x-y
    {'c', 'a', 'b'}
    >>> y-x
    {'g', 'f', 'h'}
    
    >>> x.difference(y)
    {'c', 'a', 'b'}
    >>> y.difference(x)
    {'g', 'f', 'h'}
    

    还有XOR操作,取集合1、集合2中非交集的部分:

    >>> x ^ y
    {'f', 'a', 'h', 'b', 'c', 'g'}
    
    >>> x.symmetric_difference(y)
    

    下面是测试两个集合之间是否是子集、真子集、超集的关系,s1和s2都是集合。同样,使用函数版的可以是其它类型。

    # 子集
    s1 <= s2
    s1.issubset(s2)
    s1.issubset(other_type)
    
    # 真子集
    s1 < s2
    
    # 超集
    s1 >= s2
    s1.issuperset(s2)
    s1.issuperset(other_type)
    
    # 真超集
    s1 > s2
    

    s1.isdisjoint(other_type)测试集合和另一个数据容器(如集合、列表)是否存在相交数据。即集合中的元素和其它容器是否有共同数据,如果有则返回False,否则返回True。

    >>> x.isdisjoint(y)
    False
    
    >>> x.isdisjoint(z)
    True
    
    >>> x.isdisjoint(list("ab"))
    False
    >>> x.isdisjoint(list("opq"))
    True
    

    集合基本操作

    集合类型(不是frozenset)是可变的容器类型,可以修改它(但没法检索它)、测试、迭代它,但不能检索它(除非迭代、遍历)。

    s1.add(elem)添加元素到集合s1中。因为集合中的元素都唯一,所以添加已存在的元素不会有任何效果,但也不会报错。

    s1.remove(elem)移除集合s1中的元素。

    s1.pop()随机移除一个元素并返回这个元素。

    s1.clear()清空集合。

    s1.discard(elem)移除已存在的某个元素,如果不存在则无视(返回None)。

    s1.copy()拷贝(浅拷贝)集合s1。

    len(s1)返回集合s1长度。

    i in s1测试元素i是否在集合s1中。

    除了这些基本操作外,还有基于集合运算的修改操作。

    取得并集后覆盖集合s1:

    s1.update(*others)
    s1 |= other |...
    

    取得交集后覆盖集合s1:

    s1.intersection_update(*others)
    s1 &= other & ...
    

    取得差集后覆盖集合s1:

    s1.difference_update(*others)
    s1 -= other |...
    

    取得XOR运算后的结果覆盖集合s1:

    s1.symmetric_difference_update(other)
    s1 ^= other
    

    集合解析

    到目前为止,各种解析表达式的方式已经很清晰了。所以看示例即可:

    >>> {x for x in 'abcde'}
    {'b', 'e', 'c', 'a', 'd'}
    
    >>> {c*2 for c in "abcde"}
    {'ee', 'bb', 'cc', 'dd', 'aa'}
    
  • 相关阅读:
    UOJ.26.[IOI2014]Game(交互 思路)
    Good Bye 2016 F.New Year and Finding Roots(交互)
    Codeforces.835E.The penguin's game(交互 按位统计 二分)
    Codeforces.744B.Hongcow's Game(交互 按位统计)
    Codeforces.862D.Mahmoud and Ehab and the binary string(交互 二分)
    正睿OI 提高 Day1T3 ZYB玩字符串(DP)
    划分vlan
    2三层交换机实现vlan间的路由
    交换机基础-交换机远程telnet
    自动化运维环境的搭建问题处理
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/10159413.html
Copyright © 2011-2022 走看看