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'}
    
  • 相关阅读:
    页面边距设置
    事件
    Ora-00906:missing left parenthesis
    Oracle
    数据转移:把数据从一个表转到另一个表
    修改字段默认值
    数据升级包
    触发器
    复制数据库数据
    VMware vSphere Client
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/10159413.html
Copyright © 2011-2022 走看看