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

     

    集合set是Python中一种基本数据类型,它分为可变集合(set)和不可变集合(frozenset)两种。类似于其他语言,集合是一个无序不重复元素集,包括创建集合set、向集合中添加元素、删除集合中的元素、求集合的交集、并集、差集等操作。

    可变集合

    set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。

    >>> set((1,2,3,4))

    set([1, 2, 3, 4])

    >>> a=['a','b']

    >>> b=['b','c']

    >>> set(a+b)

    set(['a', 'c', 'b'])

    >>> set(['a', 'c', 'b'])

    set(['a', 'c', 'b'])

    >>> set((1,2,3,4,4,4))

    set([1, 2, 3, 4])

     

    不可变集合

    集合中的元素不可以被改变,不能做插入和删除操作,其他方法和可变集合基本相同。

    >>> frozenset([1,2])

    frozenset([1, 2])

     

    可以生成空集合

    >>> set([])

    set([])

    >>> set(())

    set([])

     

    set("sabd")传字符串给set,会被拆开

     

    >>> set("abvcd")

    set(['a', 'c', 'b', 'd', 'v'])

     

    增加

    a.add("ab")增加,字符串不会拆开

    >>> a=set()

    >>> a

    set([])

    >>> a.add("bb")

    >>> a

    set(['bb'])

    >>> a.add("cc")

    >>> a

    set(['cc', 'bb'])

    >>> 

     

    a.update("cd")update中的字符串会被拆开成单独的元素

    >>> a

    set(['cc', 'bb'])

    >>> a.update("cd")

    >>> a

    set(['cc', 'c', 'd', 'bb'])

    >>> 

     

    元祖不可以加可变元素,列表。、。。

     

    >>> a.add([1,2])

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

    TypeError: unhashable type: 'list'

     

    remove()删除集合元素

    >>> a

    set(['a', 'c', 'b', 'd', 'bb', 'cc', 13, 14, (2, 3)])

    >>> a.remove((2,3))

    >>> a

    set(['a', 'c', 'b', 'd', 'bb', 'cc', 13, 14])

     

    #encoding=utf-8

     

    s=set('hello')

    print u"删除前的集合:",s

    try:

        s.remove('h')

    except KeyError,e:

        print u"集合中不存在该元素!"

    else:

        print u"集合中元素删除成功!"

        print u"删除某元素后的集合:",s

     

    c:Python27Scripts>python task_test.py

    删除前的集合: set(['h', 'e', 'l', 'o'])

    集合中元素删除成功!

    删除某元素后的集合: set(['e', 'l', 'o'])

     

    del a 删除整个集合

    >>> a=set(range(5))

    >>> a

    set([0, 1, 2, 3, 4])

    >>> del a

    >>> a

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

    NameError: name 'a' is not defined

     

     

    集合遍历

    >>> a=set(range(5))

    >>> a

    set([0, 1, 2, 3, 4])

    >>> for i in a:

    ...     print i

    ...

    0

    1

    2

    3

    4

     

    enumerate(集合)

    #encoding=utf-8

     

    sTest=set(['a','b','c','d','1','2','3'])

     

    print u"集合为:",sTest

     

    for index,elem in enumerate(sTest):

    print u"元素的索引号为:", index,u"对应的元素为:",elem

     

    c:Python27Scripts>python task_test.py

    集合为: set(['a', 'c', 'b', 'd', '1', '3', '2'])

    元素的索引号为: 0 对应的元素为: a

    元素的索引号为: 1 对应的元素为: c

    元素的索引号为: 2 对应的元素为: b

    元素的索引号为: 3 对应的元素为: d

    元素的索引号为: 4 对应的元素为: 1

    元素的索引号为: 5 对应的元素为: 3

    元素的索引号为: 6 对应的元素为: 2

     

    >>> for index,elem in enumerate(a):

    ...     print index, elem

    ...

    0 a

    1 d

    2 f

    3 i

    4 k

    5 j

    6 s

     

    集合和列表,元组之间互相转换

    集合和序列之间的转换跟序列之间互转是一样的,唯一不同的就是序列转成集合后,重复的元素被去掉了

    集合转字符串时,直接使用str()函数进行转换,得到的将是集合的字符串形式。要想真正转成字符串,我们需要借助字符串连接函数join()函数来完成。

    >>> a=set(list("sdfsadf"))

    >>> a

    set(['a', 's', 'd', 'f'])

    >>> a=list("askldjf")

    >>> a

    ['a', 's', 'k', 'l', 'd', 'j', 'f']

    >>> set(a)

    set(['a', 'd', 'f', 'k', 'j', 'l', 's'])

    >>> list(set(a))

    ['a', 'd', 'f', 'k', 'j', 'l', 's']

    >>> a

    ['a', 's', 'k', 'l', 'd', 'j', 'f']

    >>> "".join(list(set(a)))

    'adfkjls'

    >>> tuple(set(a))

    ('a', 'd', 'f', 'k', 'j', 'l', 's')

    >>> set(tuple(set(a)))

    set(['a', 'd', 'f', 'k', 'j', 'l', 's'])

    >>> 

     

    a.discard()删除集合中元素

    >>> a=set(a)

    >>> a

    set(['a', 'd', 'f', 'k', 'j', 'l', 's'])

    >>> a.discard('a')

    >>> a

    set(['d', 'f', 'k', 'j', 'l', 's'])

     

    a.pop()删除集合的第一个值

    函数原型: s.pop() 参数说明: s:为set类型的变量 函数作用: 删除并返回集合s中的第一个元素,如果为空引发KeyError错误

    >>> a

    set(['f', 'k', 'j', 'l', 's'])

    >>> a.pop()

    'f'

    >>> a.pop()

    'k'

    >>> a.pop()

    'j'

    >>> a.pop()

    'l'

    >>> a.pop()

    's'

    a.copy拷贝

    >>> a=set(list("sadfsadf"))

    >>> a

    set(['a', 's', 'd', 'f'])

    >>> b=a.copy()

    >>> b

    set(['a', 's', 'd', 'f'])

    >>> id(a)

    50435464L

    >>> id(b)

    50260008L

    >>> a.remove('a')

    >>> a

    set(['s', 'd', 'f'])

    >>> b

    set(['a', 's', 'd', 'f'])

    >>> a.clear()

    >>> a

    set([])

    >>> b

    set(['a', 's', 'd', 'f'])

     

    变量a和b都指向5这个数的地址,把a赋值2,a指向了2的地址,a的地址就变了,b还是指向5这个地址

    列表a,b再相同的场景下,执行的地址相同,且不会变,一个做了改变,另一个也变,因为地址还是一个地址

     

    >>> a=5

    >>> b=a

    >>> b

    5

    >>> id(a)

    44195672L

    >>> id(b)

    44195672L

    >>> a=2

    >>> b

    5

    >>> a

    ['a', 's', 'd', 'f']

    >>> b=a

    >>> b

    ['a', 's', 'd', 'f']

    >>> a

    ['a', 's', 'd', 'f']

    >>> id(a)

    51080328L

    >>> id(b)

    51080328L

    >>> a+['sd']

    ['a', 's', 'd', 'f', 'sd']

    >>> id(a)

    51080328L

    a.    clear()清空len(a)长度

    >>> b

    set(['a', 's', 'd', 'f'])

    >>> len(b)

    4

    >>> b.clear()

    >>> b

    set([])

    >>> 

    集合交集&、并集|、差集-

    >>> a

    set([4, 5, 6, 7])

    >>> b

    set([3, 4, 5])

    >>> a&b

    set([4, 5])

    >>> a|b

    set([3, 4, 5, 6, 7])

    >>> a-b

    set([6, 7])

    a.difference(b)在集合a中,不在集合b中的元素

    查看两个集合的不同之处,使用的difference函数,等价于差集。如: s1.difference(s2) 这种不同指的是集合s1相对于集合s2,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。

    >>> a

    set([4, 5, 6, 7])

    >>> b

    set([3, 4, 5])

    >>> a.difference(b)

    set([6, 7])

    >>> a-b

    set([6, 7])

    补集=全集-子集

    集合操作—运算符判断集合间关系

    集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。

    有如下三个集合:

    >>> a

    set([4, 5, 6, 7])

    >>> b

    set([3, 4, 5])

    >>> a>b

    False

    >>> a<b

    False

    >>> a==b

    False

    >>> a=set(range(5))

    >>> a

    set([0, 1, 2, 3, 4])

    >>> b=set(range(3))

    >>> b

    set([0, 1, 2])

    >>> a

    set([0, 1, 2, 3, 4])

    >>> a>b

    True

    >>> a<b

    False

    >>> a==b

    False

    a.issuperset(b), issuperset方法所用是判断集合st1是否是集合st2的父集,如果是返回True,否则返回False。

    a.issubset(b)判断a是否是b的子集

    >>> a

    set([0, 1, 2, 3, 4])

    >>> b

    set([0, 1, 2])

    >>> a.issuperset(b)

    True

    >>> b.issuperset(a)

    False

    >>> b.issubset(a)

    True

    >>> a.issubset(a)

    True

    >>> a.issubset(b)

    False

    >>> 

     

    集合里也可以使用成员运算符,in和not in,判断某个对象是否是集合中的成员。

    >>> a

    set([0, 1, 2, 3, 4])

    >>> b

    set([0, 1, 2])

    >>> b in a

    False

    >>> a in b

    False

    >>> 0 in a

    True

    >>> 1 in a

    True

     

    集合操作—不可变集合

    Python中还有一种不可改变的集合,那就是 frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。如果试图改变不可变集合中的元素,就会报AttributeError错误。

    不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样,不在赘述

    >>> f1=frozenset('python')

    >>> f1

    frozenset(['h', 'o', 'n', 'p', 't', 'y'])

    >>> f1.add("a")

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

    AttributeError: 'frozenset' object has no attribute 'add'

    >>> f1.update("a")

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

    AttributeError: 'frozenset' object has no attribute 'update'

    >>> 

  • 相关阅读:
    python使用Fabric模块实现自动化运维
    sublime 字体设置
    java语言输出Fibonacci数列:1 1 2 3 5 8 13....直到55
    Java-取出字符串中第一个出现且唯一的字母
    java中charAt()方法的使用
    Java indexOf() 方法
    idea查找 enter class name的快捷键
    spring boot配置文件加载位置
    @PropertySource&@ImportResource&@Bean
    @Value获取值和@ConfigurationProperties获取值比较
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/8387778.html
Copyright © 2011-2022 走看看