分类: Python/Ruby
2011-12-01 09:31:25
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 Professional》Written 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]
4,None和列表的初始化
①None是Python的一个内建值,和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]
③创建类似2行3列的二维数组的列表,又该怎么做呢?(在Python中没有数组,所以我只好说“类似”)很简单:
>>>
x = 2*[3*[None]]
>>> x
[[None, None, None], [None, None,
None]]
多维数组也用同样的思想创建出来。
5,它在这里面吗?--成员资格
①我们想知道一个值是否在序列中(序列包含元组和列表),可以使用in运算符。如果某值(我们要检查的值)在序列中的条件为真,则会返回True;为假则会返回False。True和False叫做布尔运算符,可能只学过C语言的朋友会对此感到陌生,下面我就简单地介绍一下,然后再往下讲in运算符。
②布尔一词为bool的音译。布尔表达式说白了就是判断表达式(0>5或者是7==9等),说明是判断,所以结果只可能是真(成立)或是假(不成立)。在C语言中,非0为真,0则为假,好像有点不专业。所以在C++、Java等语言中就引入了布尔运算的概念,任何一个判断表达式都只会返回一个布尔运算符(true or false),真就为true,假就为false。只是有Python中true和false的头一个字母都规定是大写的而已。
③其实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
"
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也变了,因为x和y引用的是同一个对象,还记得吗?
[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
③对于max和min函数,序列中的元素均应为实数(len函数则无此要求)。len、max和min函数对于元组一样适用。