Python内置容器(1)——列表,元组

发布时间:2019-09-01 09:52:31编辑:auto阅读(1829)

    1.列表list

        1.1定义和初始化 list

    # 定义个空列表

    In [1]: li = []

    In [2]: type(li)

    Out[2]: list

    # 初始化list,list 中的元素没有类型要求,可以是任何类型

    In [3]: li = [1,2,'a',['a',4]]

    In [4]: li

    Out[4]: [1, 2, 'a', ['a', 4]]

        1.2列表的下标

    python中列表的下标是从0开始的。

    In [4]: li

    Out[4]: [1, 2, 'a', ['a', 4]]

    In [5]: li[2]

    Out[5]: 'a'

    In [6]: li[4]

    ---------------------------------------------------------------------------

    IndexError

    Traceback (most recent call last)

    <ipython-input-6-5889debca501> in <module>()

    ----> 1 li[4]

    IndexError: list index out of range

    # 得到list 长度

    In [7]: len(li)

    Out[7]: 4

        1.3 in关键字

    在for循环中使用表示遍历list中的所有元素:

    In [8]: for x in li:

    ...:

    print x

    ...:

    1

    2

    a

    ['a', 4]

    in 也可以作为一个二元操作符使用,查找某个元素是否在list中存在:

    In [9]: 'a' in li

    Out[9]: True

    del 删除list中某个元素:

    In [10]: li

    Out[10]: [1, 2, 'a', ['a', 4]]

    In [11]: del li[0]

    In [12]: li

    Out[12]: [2, 'a', ['a', 4]]


        1.4 在python中一切皆为对象,显然,list也是对象,针对于列表对象来说,常用的操作:

    In [13]: dir(li)

    Out[13]:

    ['__add__',

    '__class__',

    .........

    '__str__',

    '__subclasshook__',

    'append',

    'count',

    'extend',

    'index',

    'insert',

    'pop',

    'remove',

    'reverse',

    'sort']

        1.4.1查看list对象append方法的帮助信息:

    In [14]: help(li.append)

    In [15]: li

    Out[15]: [2, 'a', ['a', 4]]

    In [16]: li.append(666)

    In [17]: li

    Out[17]: [2, 'a', ['a', 4], 666]

        1.4.2 extend 方法,接受一个迭代器,将迭代器的所有元素追加到list中:

    In [17]: li

    Out[17]: [2, 'a', ['a', 4], 666]

    In [18]: li.extend(['abc','cba'])

    In [19]: li

    Out[19]: [2, 'a', ['a', 4], 666, 'abc', 'cba']

        1.4.3 insert 方法

                li.insert(2,'x') , li.insert(-1,'mm') ,在某个索引下标之前插入某个数据。

        1.4.4 remove 方法

                li.remove('a') ,从list中移除某个元素。

        1.4.5 pop 方法

            接受一个可选参数index,remove下标所指向的元素,并将钙元素返回,li.pop() , li.pop(2) :

    In [19]: li

    Out[19]: [2, 'a', ['a', 4], 666, 'abc', 'cba']In [20]: li.pop()

    Out[20]: 'cba'

    In [21]: li

    Out[21]: [2, 'a', ['a', 4], 666, 'abc']

    In [22]: li.pop(2)

    Out[22]: ['a', 4]

    In [23]: li

    Out[23]: [2, 'a', 666, 'abc']

        1.4.6 count 方法

                返回某个值在list出现的次数, li.count('a')

        1.4.7 index 方法,返回第一个匹配value的下标:

    In [28]: li

    Out[28]: [2, 'a', 666]

    In [29]: li.index('a')

    Out[29]: 1

    In [30]: li.index('b')

    ---------------------------------------------------------------------------

    ValueError

    Traceback (most recent call last)

    <ipython-input-30-4639cb7d3bae> in <module>()

    ----> 1 li.index('b')

    ValueError: 'b' is not in list

    # 还可以指定起始和结束查找的范围参数 li.index('a',2,6)

    In [33]: li

    Out[33]: [2, 'a', 666, 'a', 'a', 'b']

    In [34]: li.index('a',2)

    Out[34]: 3

        1.4.8 sort 方法

                直接修改list内容,不返回值. li.sort() ,还可以接受三个可选参数。L.sort(cmp=None, key=None, reverse=False)

        1.4.9 reverse 方法。 li.reverse()


        1.5 list的切片

    li[i],li[a:b],li[a:e:b]--第三个参数为步长,index每次加几,默认为1

    In [40]: li

    Out[40]: ['b', 'a', 'a', 'a', 666, 2]

    In [41]: li[2:4]

    Out[41]: ['a', 'a']

    ####

    In [43]: li[:2]

    Out[43]: ['b', 'a']

    ###

    In [44]: li[4:]

    Out[44]: [666, 2]

    ## 对list 做一次深copy

    In [45]: li[:]

    Out[45]: ['b', 'a', 'a', 'a', 666, 2]

    ####

    In [46]: li[2:4:2]

    Out[46]: ['a']

    ## 用切片实现list 翻转

    In [47]: li

    Out[47]: ['b', 'a', 'a', 'a', 666, 2]

    In [48]: li[::-1]

    Out[48]: [2, 666, 'a', 'a', 'a', 'b']

    # 得到下标为偶数的list

    In [50]: li

    Out[50]: ['b', 'a', 'a', 'a', 666, 2]

    In [51]: li[::2]

    Out[51]: ['b', 'a', 666]

    # 得到下标为奇数的值

    In [52]: li[1::2]

    Out[52]: ['a', 'a', 2]列表的切片操作是一个复制操作,并不对原始列表进行修改。


    2.元组 tuple

        2.1 定义和初始化元组

    In [1]: t = ()

    In [2]: type(t)

    Out[2]: tuple

    In [3]: t = (1,2,3)

    In [4]: t

    Out[4]: (1, 2, 3)

        2.2元组也支持下标和切片操作。

            元组是不可变对象,不能对元祖的内容做修改

    In [4]: t

    Out[4]: (1, 2, 3)

    In [5]: t[1]

    Out[5]: 2

    In [6]: t[1] = 100

    ---------------------------------------------------------------------------

    TypeError

    Traceback (most recent call last)

    <ipython-input-6-4f066cd5e53f> in <module>()

    ----> 1 t[1] = 100

    TypeError: 'tuple' object does not support item assignment

        2.3 元组的不可变是相对的,因为元祖里面的内容可以是各种类型,如,元组的元素值为列表:

    In [7]: t1 = ([2,3,4],[19,23,45])

    In [8]: t1

    Out[8]: ([2, 3, 4], [19, 23, 45])

    In [9]: t1[0][2]

    Out[9]: 4

    In [10]: t1[0][2] = 100 #list 的值是可变的,可以被修改的

    In [11]: t1

    Out[11]: ([2, 3, 100], [19, 23, 45])

        2.4 count , index 操作

    In [12]: t

    Out[12]: (1, 2, 3)

    In [13]: t.count(2)

    Out[13]: 1

    In [14]: t.index(3)

    Out[14]: 2

    元组支持切片操作与列表的切片操作一样


    3.集合 set

        3.1定义和初始化集合

            列表和元组都是有序的,但是集合是无序的。

    In [17]: s = {1,2,3}

    In [18]: type(s)

    Out[18]: set

        3.2 集合中的元素不重复

    In [19]: s = {1,1,1,12,2,2,3,4}In [20]: s

    Out[20]: {1, 2, 3, 4, 12}


         3.3python根据集合中的每个元素的hash值来判断是否重复,所以集合中的每个元素必须是可hash的对象。在python中如果一个对象有一个__hash__ 的方法,

    表示该对象可hash.

    In [21]: 1.__hash__ # 整数1 的对象有该方法,但是__hash__ 方法不能直接调用。

    1.__hash__

    hash() 函数直接返回某个对象的hash值。如hash(1)

    集合不支持切片操作。

        3.4集合的操作:

            3.4.1 add 操作

    In [21]: s

    Out[21]: {1, 2, 3, 4, 12}

    In [22]: s.add(100)

    In [23]: s

    Out[23]: {1, 2, 3, 4, 12, 100}

        3.4.2 update 操作,迭代器作为参数,将迭代器中的所有元素追加到集合中

    In [23]: s

    Out[23]: {1, 2, 3, 4, 12, 100}

    In [24]: s.update([101,102,103])

    In [25]: s

    Out[25]: {1, 2, 3, 4, 12, 100, 101, 102, 103}

        3.4.3 remove 删除某个元素,若该元素不存在则报错

        3.4.4 discard 删除某个元素,若该元素不存在则不做任何操作。

        3.4.5 pop() 随机删除某个元素,并返回该元素

        3.4.6 clear 清空集合。s.clear()


        3.5 集合的运算

        3.5.1 difference 两个集合的差集,不修改原来的两个集合

    In [26]: s1 = {1,2,3,4,5,'a'}

    In [27]: s2 = {4,5,7,8,'b','c'}

    In [28]: s1.diff

    s1.difference

    s1.difference_update

    In [28]: s1.difference(s2)

    Out[28]: {1, 2, 3, 'a'}

    # 减号可以直接求两个集合的差集

    In [29]: s1 - s2

    Out[29]: {1, 2, 3, 'a'}

        3.5.2 difference_update 两个集合的差集,但修改原来的集合,不返回值

    In [30]: s1

    Out[30]: {1, 2, 3, 4, 5, 'a'}

    In [31]: s2

    Out[31]: {4, 5, 7, 8, 'b', 'c'}

    In [32]: s1.difference_update(s2)

    In [33]: s1

    Out[33]: {1, 2, 3, 'a'}

    In [34]: s2

    Out[34]: {4, 5, 7, 8, 'b', 'c'}intersection 两个集合的交集,返回值,不修改原来的集合

        3.5.3 intersection_update 两个集合的交集,无返回值,修改原来的集合

        3.5.4 & , s1 & s2 直接求两个集合的交集

        3.5.5 union 两个集合的并集

        3.5.6 | , s1 | s2 也是求两个集合的并集

        3.5.7 isdisjoint 查看两个集合是否有交集,返回bool, s1.isdisjoint(s2)

        3.5.8 issubset 查看是否是子集


    4. 列表,元组,集合之间的转换

        4.1 list 函数

    In [35]: list()

    Out[35]: []

    In [36]: list('hello')

    Out[36]: ['h', 'e', 'l', 'l', 'o']

        4.2 tuple 函数

        4.3 set 函数

    In [37]: t = (1,2,3)

    In [38]: type(t)

    Out[38]: tuple

    In [39]: list(t)

    Out[39]: [1, 2, 3]

    将list转换为set的时候,若列表中存在重复元素,则移除重复的元素。


关键字