Python 基础教程第二章 列表和元组

2.1序列概览

      python内建序列:列表,元组,字符串,Unicode字符串,buffer对象,xrange对象。

      列表,元组区别:列表可以修改,元组不可。使用元组作为字典的键,因为键不可修改,所以不能使用列表。

2.2通用序列操作

   2.2.1 索引

        序列中所有元素都是有编号的,从0开始。所有元素都可以通过编号分别访问。使用负数,Python会从最后一个元素 开始计数。

        例如:

>>> greeting = 'Hello'
>>> greeting[0]

'H'
>>> 'Hello'[1]

'e'

>>>fourth =  raw_input('Year: ')[3]

Year:2005

 >>>fourth

 '5'

   2.2.2分片

        索引访问某个元素,分片可以访问一定范围内的元素。通过冒号相隔的两个索引来实现:

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

>>>number[x:y:z]

        x:表示从第x个元素开始;y:表示到第y个元素结束;z:表示取出的两个元素相隔为z。x,y无值时,表示从第0个到最后一个,要有冒号分割。

            xy可以为负数,表示从结尾向前数。z也可以为负数,表示反向。

   .2.2.3序列相加

        两种相同类型的序列才能进行连接操作。

   2.2.4乘法

        数字N乘以一个序列会生成新的序列,使序列被重复N次。

                NONE.空列表,和初始化

                 空列表([]),

 >>>sequence = [None]*10

 >>>sequence

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

   2.2.5成员资格

        in可以检查一个值是否在序列中,条件为真时,返回True,假时返回False.

database = [
        ['albert','1234'],
        ['dilbert','2345'],
        ['smith','3456'],
        ['jones','4567']
        ]

username = raw_input('User name: ')
pin = raw_input('PIN code: ')
if [username,pin] in database: print 'Access granted'
else: print 'Wrong Username or Password'

   2.2.6长度,最小值,最大值

        内建函数len,min,max。

>>>number = [10,34,65]

>>>len[number]

3

>>>max[number]

65

>>>min[4,6,2,5]

2


   2.3列表:python的苦力

      2.3.1list函数 

      字符串不能向列表一样被修改,有时根据字符串创建列表会很有用。

>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>> ''.join(list('hello'))
'hello'
      list用于所有类型的序列,而不只是字符串。

      2.3.2基本的列表操作

      列表可以使用所有序列的标准操作,如索引,连接和乘法。列表是可以修改的。改变的方法有:元素赋值,元素删除,分片赋值以及列表方法。注意不是所有的列表方法都真正的改变列表。

          1 改变列表,元素赋值

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

          2 删除元素

>>> names = ['Alice','Berk','Carl','David','Echo']
>>> del names[4]
>>> names
['Alice', 'Berk', 'Carl', 'David']

          3 分片赋值

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']

          分片可以使用与原序列不等长的序列将分片替换

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

          分片赋值可以在不需要替换任何原有元素的情况下插入新的元素

>>> number = [1,5]
>>> number[1:1] = [2,3,4]
>>> number
[1, 2, 3, 4, 5]

          上面的例子只是替换了一个空的分片,因此实际的操作是插入了一个序列,以此类推,通过分片赋值来删除元素也是可行的。

>>> number
[1, 2, 3, 4, 5]
>>> number[1:4] = []
>>> number
[1, 5]

          其实也可以尝试使用步长或者负数来删除元素。


   2.3.3 列表方法

      方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象,一般来说,方法可以这样调用。对象.方法(参数)

          1 append

>>> lst = [1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
          list 是内建函数,所以用了lst。append方法直接修改原来的列表。

          2 count  统计某个元素在列表中出现的次数

>>> ['to','be','or','not','to','you'].count('to')
2
>>> x = [[1,2],1,2,1,[1,2,[2,1]]]
>>> x.count(1)
2
>>> x.count([1,2])
1

          3 extend   可以在列表的末尾一次性追加另一个序列中的多个值。

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

      extend方法很象连接操作,区别在于:extend方法修改了原来的序列,而连接操作则返回一个全新的列表。   

          4 index  index方法用于从列表中找出某个值第一个匹配项的索引位置。

>>> knight = ['we','are','the','knight','who','say','hi']
>>> knight.index('who')
4

>>> knight[4]
'who'

          5 insert insert方法用于将对象插入到列表中:

>>> number = [1,2,3,5,6]
>>> number.insert(3,'four')
>>> number
[1, 2, 3, 'four', 5, 6]
          与extend方法一样,insert方法也可以使用分片赋值来实现。
>>> number = [1,2,3,5,6]
>>> number[3:3] = ['four']
>>> number
[1, 2, 3, 'four', 5, 6]
>>> number = [1,2,3,5,6]
>>> number[3:4] = ['four','five']
>>> number
[1, 2, 3, 'four', 'five', 6]

          6 pop pop方法会移除列表的一个元素(默认最后一个),并且返回该元素的值。

>>> x = [1,2,3]
>>> x.pop()
3
>>> x.pop(0)
1
>>> x
[2]

          pop方法是唯一一个既能修改列表又返回元素值(除了None)的列表方法。

          pop方法可以实现一种常见的数据结构--栈。后进先出,LIFO原则。

>>> x = [1,2,3]
>>> x.append(x.pop())
>>> x
[1, 2, 3]

          7 remove 此方法用于移除列表中某个值的第一个匹配项。其删除后无返回值,与pop相反。

>>> x = ['to','be','or','not','to','be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
>>> x.remove('bee')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

          8 reverse 此方法将列表中的元素反向存放,改变列表但是不返回值。其返回一个迭代器(iterator),可以使用list函数把返回的对象转换成列表也是可行的。

>>> x = [1,2,3,4,5,6,7]
>>> x.reverse()
>>> x
[7, 6, 5, 4, 3, 2, 1]

>>> x = [1,2,3,4,5]
>>> list(reversed(x))
[5, 4, 3, 2, 1]

          9 sort 此方法用于在原位置对列表进行排序。改变原来的序列。
>>> x = [1,3,6,4,2,5]
>>> x.sort()
>>> x
[1, 2, 3, 4, 5, 6]


          如果想要保存原文件,可以先把x的副本赋值给y,然后对y进行排序。

>>> x = [1,3,6,4,2,5]
>>> y = x[:]
>>> y.sort()
>>> y
[1, 2, 3, 4, 5, 6]
>>> x
[1, 3, 6, 4, 2, 5]

          请注意,上述的例子再次调用x[:],这是一种很有效率复制整个列表的方法,只是简单的把x赋值给y是没用的。因为这样就让x和y都指向同一个列表了。

>>> x = [1,3,6,4,2,5]
>>> y = x
>>> y.sort()
>>> y
[1, 2, 3, 4, 5, 6]
>>> x
[1, 2, 3, 4, 5, 6]

          另一种获取已排序的列表的副本的方法是,使用sorted函数。

>>> x = [1,3,6,4,2,5]
>>> y = sorted(x)
>>> x
[1, 3, 6, 4, 2, 5]
>>> y
[1, 2, 3, 4, 5, 6]
          sorted函数可以用于任何序列,却总是返回一个列表:

>>> sorted('Python')
['P', 'h', 'n', 'o', 't', 'y']

          10 高级排序   希望元素能按照特定的方式排序,而不是默认的方式,即根据python的默认排序则按照升序排列。可以通过compare(x,y)的形式自定义比较函数,compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了,内建函数cmp提供了比较函数的默认方式。

>>> cmp(0,0)
0
>>> cmp(20,10)
1
>>> cmp(20,30)
-1
>>> number = [5,2,9,7]
>>> number.sort(cmp)
>>> number
[2, 5, 7, 9]

          sort方法有另外两个可选的参数,key和reverse。如果要使用它们,就要通过名字来指定。叫做关键字参数。参数key与cmp类似,必须提供一个在排序过程中使用的函数。该函数并不是直接用来确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。

>>> x = ['aabudh','dasfdsdag','ddgrte','eret','ddf']
>>> x.sort(key=len)
>>> x
['ddf', 'eret', 'aabudh', 'ddgrte', 'dasfdsdag']

    另一个关键字参数reverse是简单的布尔值,用来说明列表是否要进行反向排序。

>>> x = [4,6,2,1,7,9,23]
>>> x.sort(reverse=True)
>>> x
[23, 9, 7, 6, 4, 2, 1]


   2.4  元组:不可变序列

      元组与列表一样,是一种序列,只是元组不能修改。只需要用逗号分隔一些值,就创建了元组。

>>> 1,2,3,4
(1, 2, 3, 4)
>>> (1,2,3,4,5)
(1, 2, 3, 4, 5)
>>> ()
()
         空元组用没有内容的圆括号来表示。

>>> 3*(40+2)
126
>>> 3*(40+2,)
(42, 42, 42)

           圆括号和逗号共同组建了元组,少了任何一个都不能成立。

          2.4.1 tuple函数    功能与list基本上一样。

>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('abc')
('a', 'b', 'c')
>>> tuple((1,2,3))
(1, 2, 3)

          2.4.2基本元组操作    除了创建元组和访问元组之外,也没有太多其他操作,可以参照其他类型的序列来实现。

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

          元组的意义:1.可以在映射(和集合的成员)中当作键使用,而列表不行。

                                   2.元组作为很多内建函数和方法的返回值存在,也就是说你必须要对元组进行处理。只要不尝试修改元组,那么,“处理”元组在绝大多数情况下就是把他们当作列表来进行操作(除非需要使用一些元组没有的方法,例如index和count),一般来说列表可能更能满足对序列的所有要求。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值