关闭

学习《Python基础教程(第二版)》笔记3--列表和元组

188人阅读 评论(0) 收藏 举报
分类:

第2章:列表和元组

2.1 序列概览

Python包含6种内建序列,包括列表、元组、字符串、Unicode字符串、buffer对象、xrange对象。本章主要讨论列表和元组

列表与元组区别:列表可以修改,元组则不能。

需要操作一组数据的时候,序列很好用。例如可以用序列表示数据库中一个人的信息。

第一个元素是姓名,第二个是年龄。代码如下:

>>> person1 = ['zjm',24]

>>> person2 = ['zjf',19]

>>> database = [person1,person2]  //这就是序列包含其他序列。

>>> database

[['zjm', 24], ['zjf', 19]]

 

2.2 通用序列操作

所有序列都可以进行某种特定的操作。包括:索引、分片、加、乘以及检查某个元素的成员资格。

2.2.1 索引

  序列中所有元素都是有编号的----0开始递增。举例:

>>> greeting = 'hello'

>>> greeting[1]

'e'

>>> greeting[-1]  //最后一个元素的位置编号是-1

'o'

 

>>> 'hello'[-1]  //也可以直接使用索引。

'o'

>>> third = raw_input('year: ')[2]  //直接对函数返回的序列进行索引。

year: 2016

>>> third

‘1’

 

2.2.2 分片

索引访问单个元素,分片操作访问一定范围内的元素。分片通过冒号隔开的两个索引来实现。

>>> tag = '<a href="http://www.python.org">python web site</a>'

>>> tag[9:30]

'http://www.python.org'

    >>> tag = '<ahref="http://www.python.org">python web site</a>'

>>> tag[9:30] //空格也算一个字符。

'ttp://www.python.org"'

>>> tag = 'ahref="http://www.python.org">python web site</a>'

>>> tag[9:30]  //< > 号也算一个字符。

'tp://www.python.org">'

>>> tag = '<a href="http://www.python.org">python web site</a>'

>>> tag[32:-4]  //第一个索引是提取第一个元素的编号,而最后的索引则是分片以后剩余的元素的第一个元素的编号。

'python web site'

 

>>> numbers = [1,2,3,4,5]

>>> numbers[0:1]

[1]  //分片操作实现需要提供两个索引作为边界,第一个包含在片内,第二个不包含在片内。

 

1. 优雅的捷径

    >>>numbers = [1,2,3,4,5]

>>> numbers[3:5]

[4, 5]  //要访问序列最后两个元素的话,可以从正向访问。

 

>>> numbers[-3:-1]

[3, 4]

>>> numbers[-2:-1]  //但要逆向访问序列最后两个元素的话不可行。

[4]

 

>>> numbers[-2:]  //可以使用这样的捷径:若要分片所得部分包含序列最后一个元素,那么只需要置空最后一个索引即可。

[4, 5]

>>> numbers[:]   //需要复制整个序列的话,可以将两个索引都置空。

[1, 2, 3, 4, 5]

 

2. 更大的步长

     >>> numbers = [1,2,3,4,5,6,7,8,9,10]

        >>> numbers[0:3:1]  //第二个冒号后的数即为步长,默认为1

        [1, 2, 3]

        >>> numbers[0:3:2]  //步长为2

        [1, 3]

        >>> numbers[8:3:-1]  //步长不可为0,但可为负数,为负数时从后往前按给定步长遍历。

        [9, 8, 7, 6, 5]

        >>> numbers[10:0:-2]

        [10, 8, 6, 4, 2]

总结:对于一个正数步长,Python会从序列头开始向右提取,直到最后一个元素。而对于一个负数步长,则从序列尾从左开始提取,直到第一个元素。

 

 

2.2.3 序列相加

>>> [1,2,3]+[4,5,6]

[1, 2, 3, 4, 5, 6]

>>> ['hello']+['world!'] //+号进行同类型序列相加

['hello', 'world!']

 

2.2.4 乘法

>>> numbers = [1,2,3,4,5,6,7,8,9,10]

>>> numbers*2  //原来的序列被重复两次。

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

None、空列表和初始化

空列表:[]

[0]*10:创建占用10个元素空间,却没有任何内容的列表。包含100的列表。

None: 有时可能会需要一个值来代替空值,表示在里面没有放置任何元素。这时候需要使用NoneNone是一个Python的内建值。意味着什么也没有。举例:初始化长度为10的列表。

>>> sequence = [None]*10

>>> sequence

[None, None, None, None, None, None, None, None, None, None]

 

2.2.5 成员资格

检查一个值是否在序列中,可以用in运算符。举例:

>>> permissions = 'zjm'

>>> 'z' in permissions

True

>>> users = ['zjm','fcb','zjf'];

>>> raw_input('Enter your user name: ') in users  //检查成员资格。

Enter your user name: zjm

True

>>> subject = '$$$ get rich now'

>>> '$$$' in subject   //检查子字符串是否在字符串中。

>>>True

 

2.2.6 长度、最小值、最大值

内建函数lenminmax非常有用。

len返回序列所包含的元素的数量;maxmin返回序列中元素的最大值和最小值。

 

 

2.3 列表:Python的苦力

2.3.1 list函数

字符串不能像列表一样被修改,所以有时候根据字符串创建列表会非常有用,list函数用于实现这个操作。

list['hello']   //不是大括号。

Traceback (most recent call last):

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

TypeError: 'type' object has no attribute '__getitem__'

 

>>> list('hello')  //字符串创建列表。

['h', 'e', 'l', 'l', 'o']

 

2.3.2 基本的列表操作

介绍一些可以改变列表的方法:元素赋值、元素删除、分片赋值、列表方法。

   1. 元素赋值

     >>> x = [1,1,1]

        >>> x[1] = 2

        >>> x

        [1, 2, 1]

    2. 删除元素

       >>> names = ['zjm','cai','sure']

        >>> del names[1]

        >>> names

        ['zjm', 'sure']

        >>> del names[:]

        >>> names

        []

     3. 分片赋值

      分片是强大的特性,而分片赋值更加显示了它的强大。

>>> name = list('perl')

>>> name

['p', 'e', 'r', 'l']

>>> name[2:] = list('ar')  //一次为多个元素赋值。

>>> name

['p', 'e', 'a', 'r']

>>> name = list('perl')

>>> name[1:] = list('ython')  //使用与原序列不等长的序列将分片替换。

>>> name

['p', 'y', 't', 'h', 'o', 'n']

 

>>> numbers = [1,5]

>>> numbers[1:4] = [2,3,4]  //原列表只有两个元素,可以扩展空间并且替换掉原来的元素。

 

>>> numbers = [1,5]

>>> numbers[1:1] = [2,3,4]  //可以在不用替换掉任何元素的情况下插入新元素。

>>> numbers

[1, 2, 3, 4, 5]

>>> numbers = [1,2,3]

>>> numbers[-2:] = list('zj')  //-2开始向右(注意负的索引号与负的步长区别)替换元素。

>>> numbers

[1, 'z', 'j']

>>> numbers = [1,2,3]

>>> numbers[-1:] = list('zj')

>>> numbers

[1, 2, 'z', 'j']

 

2.3.3 列表方法

方法是一个与某些对象有紧密联系的函数。一般来说,方法可以这样进行调用:

对象.方法(参数)

1. append

>>> lst = [1,2,3]

>>> lst.append(4)  //用于在列表末尾追加新的对象。

>>> lst

[1, 2, 3, 4]

 

2. count

    >>> ['z','j','m'].count('z')  //用于统计某个元素在列表中出现的次数。

    1

    >>> ['z','j','m','z'].count('z')

    2

 

3. extend

>>> a = [1,2,3]

>>> b = [4,5,6]

>>> a.extend(b)  //在列表的末尾一次性追加另一个序列中的多个值。

>>> a

[1, 2, 3, 4, 5, 6]

>>> a = [1,2,3]

>>> b = [4,5,6]

>>> a+b       //连接操作也能达到相应效果。

[1, 2, 3, 4, 5, 6]

>>> a     //二者区别:extend方法修改了原始序列a,而连接操作者不会。

[1, 2, 3]

 

 

4. index

>>> knights = ['we','are','family','we']

>>> knights.index('we')  //从列表中找出某个值第一个匹配项的索引位置。

0

>>> knights = ['you','are','family','we']

>>> knights.index('we')

3

 

5. insert

>>> numbers = [1,2,4,5]

>>> numbers.insert(2,3)  //用于将对象插入列表中。

>>> numbers

[1, 2, 3, 4, 5]

 

6. pop

>>> x = [1,2,3]

>>> x.pop()  //移除表中一个元素(默认为列表最后一个),并返回该元素的值。

3

>>> x.pop(0)

1

 

7. remove

>>> x = ['to','be','do','it','be']

>>> x.remove('be')  //移除列表中某个值的第一个匹配项。

>>> x

['to', 'do', 'it', 'be']

 

8. reverse

>>> x = [1,2,3]

>>> x.reverse()   //将列表中元素反向存放。

>>> x

[3, 2, 1]

 

9. sort

sort方法用于在原位置对列表进行排序。在原位置排序意味着改变原来的列表,而不是简单地返回一个已排序的列表副本。

>>> x = [1,4,2,12,23,10]

>>> x.sort()

>>> x

[1, 2, 4, 10, 12, 23]

 

但当用户需要一个排序好的副本又需要保留原有列表不变时,问题就出现了。

 

为实现这个功能,我们会想到这样的方法:

>>> x = [1,4,2,12,23,10]

>>> y = x.sort()

>>> y    //很明显这样的方法是不对的,y不是排序后的x。因为sort()方法修改了x序列的值却返回了空值。

>>> x

[1, 2, 4, 10, 12, 23]

 

可以用这样的的方法解决:

     >>> x = [1,4,2,12,23,10]

     >>> y = x[:]   //x的副本赋给y

     >>> y.sort()   //y进行排序

     >>> y

     [1, 2, 4, 10, 12, 23]   //副本排序了

     >>> x

     [1, 4, 2, 12, 23, 10]   //原序列x没变

 

     只是简单地把x赋值给y也是没用的,因为这样xy都指向了同一个序列。

     >>> x = [1,4,2,12,23,10]

     >>> y = x

     >>> y.sort()

     >>> y

     [1, 2, 4, 10, 12, 23]

     >>> x

     [1, 2, 4, 10, 12, 23]

 

另一种可以实现如上功能的方法是直接使用sorted函数。

>>> x = [1,4,2,12,23,10]

>>> y = sorted(x)

>>> y

[1, 2, 4, 10, 12, 23]

>>> x

[1, 4, 2, 12, 23, 10]

 

>>> sorted('python')

['h', 'n', 'o', 'p', 't', 'y']  //对字母的先后顺序进行排序,这个函数可用于任何序列,总是返回一个列表。

 

10. 高级排序

若希望按特定方式进行排序(默认为升序排列),sort方法有三个可选参数——cmpkeyreverse

 

>>> numbers = [3,2,1,5,4]

>>> numbers.sort(cmp)   //cmp参数就是函数默认的升序方式。

>>> numbers

[1, 2, 3, 4, 5]

 

>>> x = ['addrcac','ssff','dddddd','sfdsdsdsds','dd']

>>> x.sort(key = len)   //参数key必须提供一个在排序过程中使用的函数。该函数并不是直接用来确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。如要根据长度排序,可用len函数。

>>> x

['dd', 'ssff', 'dddddd', 'addrcac', 'sfdsdsdsds']

 

>>> x = [2,3,1,6,3,8,19]

>>> x.sort(reverse = True)  //reverse参数用于指定反向排序。

>>> x

[19, 8, 6, 3, 3, 2, 1]

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1518次
    • 积分:137
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档