Python 元组和集合的特点及常用操作

发布时间:2019-09-10 09:18:46编辑:auto阅读(1995)

    一、元组的特点:

    1、有序的集合

    2、通过偏移来取数据

    3、属于不可变的对象,不能在原地修改内容,没有排序,修改等操作。


    tuple支持的方法很少

    >>> dir(tuple)
    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']


    >>> a = (1,2,3)
    >>> a[0]
    1
    >>> a[1:3]
    (2, 3)


    通过tuple的类型转换,来修改变量的引用

    >>> a = (1,2,3)
    >>> b= list(a)
    >>> b[0]=5
    >>> type(b)
    <type 'list'>
    >>> b
    [5, 2, 3]
    >>> a=tuple(b) ###新生成了一个对象,表面上是修改成功了
    >>> a
    (5, 2, 3)




    思考:元组不能改变,那为什么有列表,还要有元组呢?元组一般当成参数传递给方法,而不是传递列表,元组不可变的好处,保证数据的安全,比如我们传给一个不熟悉的方法或者数据接口,确保方法或者接口不会改变我们的数据从而导致程序问题。


    #!/usr/bin/python
    #coding:utf-8
    def info(a):
        ""我们不熟悉的方法""
    print 'sss %d' % id(a)
    a[0]="haha"
    return a
    a = [1,2,3]
    print "start-"
    print id(a)
    info(a) #一个列表传给了一个方法,却改变了这个列表的值,这里如果是a=(1,2,3)则相对的安全
    print a


    #!/usr/bin/python
    #coding:utf-8
    def info(a):
        b =a[:] #拷贝会生成一个新的列表对象
    print 'sss %d' % id(a)
    b[0]="haha"
    return a #不会修改列表的值
    a = [1,2,3]
    print "start-"
    print id(a)
    info(a)
    print a


    二、集合:集合是没有顺序的概念。所以不能用切片和索引操作。内置方法set(),接收可迭代的对象,如果对象有__iter__ 属性,就是可以迭代的对象,如字符串、列表、元组

    1、创建集合。set():可变的 ;不可变的frozenset():

    2、添加操作: add,update,注意update和add的区别

    3、删除 remove

    4、成员关系 in,not in

    6、交集,并集,差集 & | -

    7、set去重  列表内容元素重复


    >>> b=set('abc')
    >>> b
    set(['a', 'c', 'b'])
    >>> b.add('python') #作为一个整体,添加单个对象到集合里
    >>> b
    set(['a', 'python', 'c', 'b'])
    >>> b.update('hello') #打散了,把对象里的每个元素添加到集合里
    >>> b
    set(['a', 'c', 'b', 'e', 'python', 'h', 'l', 'o'])



    >>> b.remove('python')
    >>> b.remove('python') #删除不存在的原始,会有异常
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    KeyError: 'python'
    >>> b
    set(['a', 'c', 'b', 'e', 'h', 'l', 'o'])


    >>> 'c' in b
    True
    >>> 'x' in b
    False
    >>> 'x' not in b
    True
    >>> a = set('abcd')
    >>> b= set('bcdef')
    >>> a & b  #求集合的交集
    set(['c', 'b', 'd'])
    >>> a | b  #求并集
    set(['a', 'c', 'b', 'e', 'd', 'f'])
    >>> a - b  #求差集
    set(['a'])





    ##不可变集合,frozenset,不能进行添加,修改和删除的操作

    >>> a = frozenset('bac')  #frozenset是有序的
    >>> a.add('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    AttributeError: 'frozenset' object has no attribute 'add'
    >>> a.remove('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    AttributeError: 'frozenset' object has no attribute 'remove'
    >>> a
    frozenset(['a', 'c', 'b'])








    ##判断2个集合是否相等,和元素本身有关,和顺序无关。

    >>> print set('abc') == set('cba')
    True


    list 去重的两种方法

    l

    iststr = ['haha','gag','hehe','haha']
    #for循环
    m = []
    for i in liststr:
        if i not in m:
            m.append(i)
           
    print m
    ['haha', 'gag', 'hehe']


    >>> m = set(liststr)
    >>> m
    set(['gag', 'hehe', 'haha'])
    >>> print list(m)
    ['gag', 'hehe', 'haha']





    练习:


    a = (1,2,3)


    一、用2种方法输出实现下面的结果:


    (5,2,3)

    >>> a = (1,2,3)
    >>> b=list(a)
    >>> b[0]=5
    >>> a=tuple(b)
    >>> a
    (5, 2, 3)





    2 判断2是否在元组里

    >>> 2 in a
    True


    二、集合a = set(['a','b','c'])做下面的操作:


    1、添加字符串'jay'到集合a里。

    >>> a = set(['a','b','c'])
    >>> a.add('jay')
    >>> a
    set(['a', 'c', 'b', 'jay'])


    2、集合b = set(['b','e','f','g']) 用2种方法求集合a 和集合b的并集。


    >>> b = set(['b','e','f','g'])
    >>> a
    set(['a', 'c', 'b', 'jay'])
    >>> a|b
    set(['a', 'c', 'b', 'e', 'g', 'jay', 'f'])


关键字