zoukankan      html  css  js  c++  java
  • 《转》python 10 集合

    自 http://www.cnblogs.com/BeginMan/p/3160565.html

    一、目录

    1、集合概述

    2、关于集合的操作符、关系符号

    3、集合的一系列操作(添加、更新、访问、删除)

    4、关于集合的内建函数、内建方法

    5、小结

    二、集合概述

    集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。

    集合元素(set elements):组成集合的成员

    1 >>> li=['a','b','c','a']
    2 >>> se =set(li)
    3 >>> se
    4 set(['a', 'c', 'b'])

    集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键

    复制代码
    >>> li=[['a','b','c'],['a','c']]
    >>> se = set(li)
    
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        se = set(li)
    TypeError: list objects are unhashable
    复制代码

    集合分类:可变集合、不可变集合

    可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素

    不可变集合(frozenset):与上面恰恰相反

    集合操作符与关系符号:(忘完了!)

    三、集合的相关操作

    1、创建集合

    由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建

    复制代码
    >>> s = set('beginman')
    >>> s
    set(['a', 'b', 'e', 'g', 'i', 'm', 'n'])
    >>> t = frozenset('pythonman')
    >>> t
    frozenset(['a', 'h', 'm', 'o', 'n', 'p', 't', 'y'])
    >>> type(s),type(t)
    (<type 'set'>, <type 'frozenset'>)
    >>> len(s),len(t)
    (7, 8)
    >>> s==t
    False
    >>> s=t
    >>> s==t
    True
    >>> 
    复制代码

    2、访问集合

    由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。

    复制代码
    >>> 'a' in s
    True
    >>> 'z' in s
    False
    >>> for i in s:
        print i
    
        
    a
    h
    m
    o
    n
    p
    t
    y
    >>> 
    复制代码

    3、更新集合

    可使用以下内建方法来更新:

    s.add()
    s.update()
    s.remove()

    注意只有可变集合才能更新:

    复制代码
    >>> s.add(0)
    
    Traceback (most recent call last):
      File "<pyshell#46>", line 1, in <module>
        s.add(0)
    AttributeError: 'frozenset' object has no attribute 'add'
    >>> type(s)
    <type 'frozenset'>
    >>> se = set(s)
    >>> se
    set(['a', 'h', 'm', 'o', 'n', 'p', 't', 'y'])
    >>> type(se)
    <type 'set'>
    >>> se.add(0)
    >>> se
    set(['a', 0, 'h', 'm', 'o', 'n', 'p', 't', 'y'])
    >>> se.update('MM')
    >>> se
    set(['a', 0, 'h', 'm', 'o', 'n', 'p', 'M', 't', 'y'])
    >>> se.update('Django')
    >>> se
    set(['a', 0, 'D', 'g', 'h', 'j', 'm', 'o', 'n', 'p', 'M', 't', 'y'])
    >>> se.remove('D')
    >>> se
    set(['a', 0, 'g', 'h', 'j', 'm', 'o', 'n', 'p', 'M', 't', 'y'])
    >>> 
    复制代码

    del:删除集合本身

     四、集合类型操作符

    1、in ,not in
    2、集合等价与不等价(==, !=)
    3、子集、超集(见上表)

    >>> set('shop')<set('cheeshop')
    True
    >>> set('bookshop')>=set('shop')
    True

    4、联合(|)

    联合(union)操作与集合的OR操作其实等价的,联合符号有个等价的方法,union()。

    >>> s1=set('begin')
    >>> s2=set('man')
    >>> s3=s1|s2
    >>> s3
    set(['a', 'b', 'e', 'g', 'i', 'm', 'n'])
    >>> s1.union(s2)
    set(['a', 'b', 'e', 'g', 'i', 'm', 'n'])

    但+ 运算则不适合:

    复制代码
    >>> s3New = s1+s2
    
    Traceback (most recent call last):
      File "<pyshell#68>", line 1, in <module>
        s3New = s1+s2
    TypeError: unsupported operand type(s) for +: 'set' and 'set'
    复制代码

    5、交集(&)

    与集合AND等价,交集符号的等价方法是intersection()

    >>> s1&s2
    set(['n'])
    >>> s1.intersection(s2)
    set(['n'])

    6、查补(-)
    等价方法是difference()

    >>> s1-s2
    set(['i', 'b', 'e', 'g'])
    >>> s1.difference(s2)
    set(['i', 'b', 'e', 'g'])

    7、对称差分(^)

    对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference()

    >>> s1^s2
    set(['a', 'b', 'e', 'g', 'i', 'm'])
    >>> s1.symmetric_difference(s2)
    set(['a', 'b', 'e', 'g', 'i', 'm'])

    注意:集合之间and,or

    >>> s1 and s2
    set(['a', 'm', 'n'])   #取 s2
    >>> s1 or s2
    set(['i', 'b', 'e', 'g', 'n']) #取 s1
    >>> 

    五、集合、列表、元组、字符串之间转换

    复制代码
    >>> list(s1)
    ['i', 'b', 'e', 'g', 'n']
    >>> str(s1)
    "set(['i', 'b', 'e', 'g', 'n'])"
    >>> tuple(s1)
    ('i', 'b', 'e', 'g', 'n')
    复制代码

    应用:

    '''最简单的去重方式'''
    lis = [1,2,3,4,1,2,3,4]
    print list(set(lis))    #[1, 2, 3, 4]

    六、关于集合的内建函数、内建方法

    1、len():返回集合元素个数

    2、set()、frozenset()工厂函数

    3、所有集合方法:

    4、仅适合可变集合

  • 相关阅读:
    HDU2363 最短路+贪心
    stl-----map去重,排序,计数
    STL------sort三种比较算子定义
    栈------表达式求值
    踩水坑系列一
    第一周 动态规划Dynamic Programming(一)
    模拟递归回溯贪心专题入门
    HDU1013,1163 ,2035九余数定理 快速幂取模
    HDU1005 找规律 or 循环点 or 矩阵快速幂
    入门基础常识
  • 原文地址:https://www.cnblogs.com/cmybky/p/11772289.html
Copyright © 2011-2022 走看看