Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69954
  • 博文数量: 13
  • 博客积分: 296
  • 博客等级: 二等列兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-18 16:40
文章分类

全部博文(13)

文章存档

2012年(9)

2011年(4)

我的朋友

分类: Python/Ruby

2011-12-01 09:31:25

大家应该听说过动态数组或链表了吧,我现在将要介绍的是Python列表的使用方法,也会告诉大家怎么改造它,使它成为栈或队列。

  1,列表的创建

  元组是用圆括号表示的,列表就是用方括号[]表示的。

  创建列表时不能像创建元组一样只用逗号分隔一些值就行了,而是一定要加上方括号

>>> [1,2,3]   #像这样子
[1, 2, 3]

  也可用list函数创建列表。list函数以一个序列作为参数并把它转换为列表。但如果参数就是列表,那么该参数就会被原样返回。

>>> list("I'm Alex")
['I', "'", 'm', ' ', 'A', 'l', 'e', 'x']

  和元组一样,可以这样创建空列表:

>>> []
[]

  列表中可以包含元组,但也可以包含列表

>>> [[1,2,3],["hello","world"]]
[[1, 2, 3], ['hello', 'world']]

  和元组不一样,列表中可以同时包含多种不同类型的数据(即列表可以存储任何对象),也可包含变量

 列表中的元素的值还可被修改

>>> x = [1,2,4]
>>> [1,2,3,x]
[1, 2, 3, [1, 2, 4]]
>>> x[2] = 3   #
我在这修改了列表x的一个元素
>>> [1,2,3,x]   #
一样的表达式,不一样的结果
[1, 2, 3, [1, 2, 3]]

  2,列表的基本操作

“加法”、“乘法”、索引操作和分片操作对列表同样适用,元组用分片操作返回的是一个新的元组,而列表用分片操作返回的是一个新的列表

  由于列表可以被修改,这就使得分片操作对于列表有更多的作用:分片赋值。

  但我要在此事先声明一下,下面的所有分片操作只适用于列表,对元组不适用

  在这里我引用《Beginning Python From Novice to ProfessionalWritten By Magnus Lie Hetland(《Python基础教程》[] Magnus Lie Hetland)中的代码例子。

>>> 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:1] = [2,3,4]
>>> numbers
[1, 2, 3, 4, 5]

  它还可用于删除元素

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

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

  大家还可以根据分片的其它特性(如设置步长,或用负数索引等)把分片赋值拓展开来,在此我就不多说了。

  3,是同一个吗?

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

>>> x[1] = 4

>>> x
[1, 4, 3]

  大家猜一下:现在y元素的值有哪些?

>>> y
[1, 4, 3]

  x列表变了,但y列表也变了。为什么会这样呢?

  这是因为变量x和变量y在内存中引用的是同一对象。(很像指针对吧,但它们是用引用实现的。如果大家看不明白括号里的内容,可以忽略)

  如果我们只是想复制一个列表,而不是使两个变量引用同一对象,那该怎么办呢?我们不妨回想一下分片,分片操作是会返回一个新的序列,是新的哦

  好了,我现在用代码来告诉你们答案吧:

>>> x = [1,2,3]
>>> y = x[:]  #
分片这个技巧很有用哦,希望大家能记住
>>> x[1] = 4
>>> x
[1, 4, 3]
>>> y
[1, 2, 3]

  4None和列表的初始化

  NonePython的一个内建值,和C语言中的null很类似,我们通常用None来初始化列表

  如果现在此们要创建并初始化一个长度为10的列表应怎么办?C语言可以这样写:int x[100]={0}; (C语言中,我们习惯用0初始化数组)Python更简单:

>>> x = 10*[None]
>>> x
[None, None, None, None, None, None, None, None, None, None]

  创建类似23列的二维数组的列表,又该怎么做呢?(在Python中没有数组,所以我只好说“类似”)很简单:

>>> x = 2*[3*[None]]
>>> x
[[None, None, None], [None, None, None]]

  多维数组也用同样的思想创建出来。

  5,它在这里面吗?--成员资格

  我们想知道一个值是否在序列中(序列包含元组和列表),可以使用in运算符。如果某值(我们要检查的值)在序列中的条件为真,则会返回True;为假则会返回FalseTrueFalse叫做布尔运算符,可能只学过C语言的朋友会对此感到陌生,下面我就简单地介绍一下,然后再往下讲in运算符。

  布尔一词为bool的音译。布尔表达式说白了就是判断表达式(0>5或者是7==9等),说明是判断,所以结果只可能是真(成立)或是假(不成立)。在C语言中,非0为真,0则为假,好像有点不专业。所以在C++Java等语言中就引入了布尔运算的概念,任何一个判断表达式都只会返回一个布尔运算符(true or false),真就为true,假就为false。只是有Pythontruefalse的头一个字母都规定是大写的而已。

  其实in运算符的内容也不是很多,我举两个例子大家就明白了:

>>> namesOfMyGrilfriends = ['Alice','Jenny','Olive','Eliza','Kate']  #开玩笑哦,我还没拍过拖啦
>>> 'Kate' in namesOfMyGrilfriends  #她是我的女朋友
True
>>> 'Taylor' in namesOfMyGrilfriends  #
她不是我的女朋友
False

  6,列表说:“我是一个名副其实的可变序列,我堂哥叫动态数组!

  大家应该会发现一个问题,列表和元组一样,索引必须在一定范围内才合法,那么不就说明列表的长度不可变吗?

  没错,列表的索引是必须在一定范围内才合法。但有方法可以在列表的最后追加新的元素:使用append方法

>>> numbers = [1,2,3]
>>> numbers.append(4)
>>> numbers   #append
不是返回一个列表,而是直接修改了原来的列表
[1, 2, 3, 4]

  extend方法可以在列表的末尾追加另一个序列(元组或列表等)中的多个值,即是可以用新列表扩展原有的列表

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)  #
其实这条语句等价于:a = a+b
>>> a
[1, 2, 3, 4, 5, 6]

  index方法可用于从列表中找出第一次某值(我们要找的值)的索引

>>> sentence = ['This','apple','is','red','that','apple','is','green']
>>> sentence.index('apple')  #
第一个出现'apple'的位置的索引为1
1

  但某值不在序列中,则会引发一个异常(就是错误的意思,异常是术语,我都会用异常这个表达):

>>> x.index('banana')

Traceback (most recent call last):
  File "", line 1, in
    x.index('banana')
ValueError: list.index(x): x not in list

  要从列表中删除元素有两种方式:按索引删除和按值删除

  想要按索引删除列表中的元素可以用del语句,具体使用方法请看例子:

>>> sentence = ['This','apple','is','red','that','apple','is','green']
>>> del sentence[6]
>>> sentence  #
索引为6的元素被删除了,即第二个'is'被删除了
['This', 'apple', 'is', 'red', 'that', 'apple', 'green']

  如果想按值删除可以用remove方法,remove方法会删除列表中某个值的第一个匹配项,请看例子:

>>> sentence = ['This','apple','is','red','that','apple','is','green']
>>> sentence.remove('apple')  #
删除第一个值为'apple'的元素
>>> sentence  #第一个“苹果”不见了
['This', 'is', 'red', 'that', 'apple', 'is', 'green']

  7,列表的排序

  大家很多时候会需要用到排序,这时sort方法就派得上用场了(它默认是从小到大排序):

>>> number = [12,84,56,51,29,97,42,61]
>>> number.sort()
>>> number
[12, 29, 42, 51, 56, 61, 84, 97]

  如果是想从大到小排序又怎么办呢?reverse方法翻转整个列表就可以了

>>> number
[97, 84, 61, 56, 51, 42, 29, 12]

  我们也可把sort方法的reverse参数设置为True值,也能达到从大到小排序的效果

>>> number = [12,84,56,51,29,97,42,61]
>>> number.sort(reverse=True)  #
因为reverse参数的默认值为False,即默认从小到大排序
>>> number
[97, 84, 61, 56, 51, 42, 29, 12]
 
sort方法不会返回任何值

>>> x = [3,2,1]
>>> y = x.sort()
   #这个语句是错的,所以不要做用一个变量来接收sort方法返回值这样傻事

  还有我想再强调一下第3节中的内容(是同一个吗?),请看例子和注释:

>>> x = [3,2,1]
>>> y = x  #
如果不想发生这种错误可以把这条语句改为:y = x[:] 
>>> x.sort()
>>> x
[1, 2, 3]
>>> y    #
x排序,但y也变了,因为xy引用的是同一个对象,还记得吗?
[1, 2, 3]

  也可以用sorted函数修改它。sorted会对作为参数传进来的序列(是序列)进行排序,并返回排序完成后的列表(注意:是列表,总是返回列表),但不会改动原有序列的顺序

>>> x = [3,2,1]
>>> y = sorted(x)
>>> x
[3, 2, 1]
>>> y
[1, 2, 3]

  8......:“栈、队列,变身”(抄袭超人)

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

>>> sentence = ['This','apple','is','red','that','apple','is','green']

>>> sentence.pop()   #从列表中删除最后一个元素并返回它的值
'green' 
>>> sentence    #
最后一个元素不见了!
['This', 'apple', 'is', 'red', 'that', 'apple', 'is']

  也可设置删除其它值(接着上面代码):

>>> sentence.pop(1)   #从列表中删除索引为1的元素并返回它的值
'apple'
>>> sentence   #
第一个“苹果”也不见了!
['This', 'is', 'red', 'that', 'apple', 'is']

  是不是和del很类似?只是pop会返回值,而del不会

  记得栈是怎样的吗?后进先出(LIFO,Left In First Out),进的时候我们可以用append方法把新来的追加到列表的末尾,出时用直接用默认的pop方法删除最后一个元素并可用变量接收它的值。

  队列则是先进先出(FIFO,First In First Out),进的方式和栈一样,出则是用pop(0)删除第一个元素并可用变量接收它的值。

  9,还有一些常用的方法咧!

  len函数大家会用得较多,以一个序列为参数,返回该序列的长度

  max函数会返回序列中的最大值,min则会返回最小值,请看例子:

>>> len(number)
8
>>> max(number)
97
>>> min(number)
12

  对于maxmin函数,序列中的元素均应为实数(len函数则无此要求)lenmaxmin函数对于元组一样适用

阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~