1.1 序列概览
列表和元组的主要区别在于,列表可以修改,元组则不能。
序列中的最后一个元素标记为-1,倒数第二个元素为-2,以此类推。第一个元素索引为0。
看实例:
[python]
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> edward = ['Edward Gumby',42]#表示姓名,年龄,这是一个列表实例
>>> john = ['John Smith',50]
>>> database = [edward,john]
>>> database
[['Edward Gumby', 42], ['John Smith', 50]]
1.2 通用序列操作
所有序列类型可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)以及检查某个元素的成员资格。
1.2.1 索引
[python]
>>> greeting = 'Hello'
>>> greeting[0]#容易理解,不解释,用过数组都明白的
'H'
[python]
>>> greeting = 'Hello'
>>> greeting[0]
'H'
>>> greeting[-1]#最后一个元素
'o'
下一个实例
[python]
>>> 'Hello'[1]
'e'
在下一个实例
假设你对用户输入年份的第4个数字感兴趣,那么,可进行如下操作:
[python]
>>> fourth = raw_input('Year: ')[3] #下标3,代表第4个数不难理解吧
Year: 2015
>>> fourth
'5'
代码1-1.py
# -*- coding: UTF-8 -*-
months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'Septemper',
'October',
'November',
'December'
]
#以1~31的数字作为结尾的列表
endings = ['st','nd','rd'] + 17 * ['th']\
+ ['st','nd','rd'] + 7 * ['th']\
+ ['st']
year = raw_input('Year: ')
month = raw_input('Month(1-12): ')
day = raw_input('Day(1-31): ')
month_number = int(month)
day_number = int(day)
#记得要将月份和天数减1,以获得正确的索引
month_name = months[month_number-1]
ordinal = day + endings[day_number-1]
print month_name + ' '+ ordinal + '.' + year
运行效果
2.2.2分片
1.索引用于访问单个元素,可以使用分片操作来访问一定范围内的元素。
[python]
>>>tag = '<a herf="http://www.python.org"> Python web site</a>'
>>>tag[9:30]
'http://www.python.org'
>>>tag[32:-4]
' Python web site'
[python]
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[4:6]
[5, 6]
>>> numbers[0:1]
[1]
>>> numbers[7:10]#访问后三个元素
[8, 9, 10]
>>> numbers[-3:-1]
[8, 9]
>>> numbers[-3:]
[8, 9, 10]
>>> numbers[-3:0]#会发生错误
[]
>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2_2.py 分片示例
[python]
#对http://www.something.com形式的URL进行分割
url = raw_input('Please enter the URL: ')
domain = url[11:-4]
print "Domain name: " + domain
运行效果:
[python]
- Please enter the URL: http://www.python.org
- Domain name: python
2.更大的步长
运行示例:
[python]
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]#前两个构成范围,最后一个是步长
[1, 3, 5, 7, 9]
>>> numbers[3:6:3]
[4]
>>> numbers[::4]
[1, 5, 9]
>>> numbers[8:3:-1]#步长可以为负数,但不能为0,表示从右往左提取元素
[9, 8, 7, 6, 5]
2.2.3序列相加
[python]
>>> [1,2,3] + [4,5,6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello,world!'
2.2.4乘法
运行示例:
[python] view plain copy
>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
None是一个Python的内建值,它的确切含意是“这里什么也没有”。如下例子可以初始化一个长度为10的空列表
[python]
>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
2_3 序列(字符串)乘法示例
[python]
#以正确的宽度在居中的“盒子”内打印一个句子
#注意,整数除法运算符(//)只能用在Python 2.2以及后续版本,在之前的版本中,只是用普通除法(/)
# -*- coding: cp936 -*-
sentence = raw_input("Sentence: ")
screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2
print
print ' ' * left_margin + '+' + '-' * (box_width - 2) + '+'
print ' ' * left_margin + '|' + ' ' * text_width + '|'
print ' ' * left_margin + '|' + sentence + '|'
print ' ' * left_margin + '|' + ' ' * text_width + '|'
print ' ' * left_margin + '+' + '-' * (box_width - 2) + '+'
print
运行效果
[python]
>>>
Sentence: He's a very naughty boy!
+----------------------------+
| |
|He's a very naughty boy!|
| |
+----------------------------+
2.2.5 成员资格
这里用到一个 "in"运算符来检查成员资格,看示例
[python]
>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
>>> users = ['mlh','foo','bar']
>>> raw_input('Enter your user name: ') in users
Enter your user name: mlh
True
2_4.py 序列成员资格示例
# -*- coding: cp936 -*-
database = [
['albert','1234'],
['dilbert','4242'],
['smith','7524'],
['jones','9843']
]
username = raw_input('User name: ')
pin = raw_input('PIN code: ')
if [username, pin] in database: print 'pass'
else: print 'error'
运行效果:
[python]
User name: albert
PIN code: 1234
pass
2.2.6 长度,最小值和最大值
[python]
>>> numbers = [100,34,678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
>>> max(2,3)
3
>>> min(9,3,2,5)
2
2.3 列表:Python的“苦力”
注:列表是可改变的
2.3.1 list函数
[python] view plain copy
- >>> list('Hello')
- ['H', 'e', 'l', 'l', 'o']
注意,list函数适用于所有类型的序列而不只是字符串。
2.3.2 基本的列表操作
1.改变列表:元素赋值
[python]
>>> x = [1,1,1]
>>> x[1] = 2
>>> x
[1, 2, 1]
2.删除元素
[python]
>>> names = ['Alice','Beth','Cecil','Dee-Dee','Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']
3.分片赋值
分片是一个非常强大的特性,分片赋值操作更加显现它的强大。
[python]
>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
不等长赋值
[python]
>>> name
['P', 'e', 'a', 'r']
>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
分片赋值语句可以在不需要替换任何原有元素的情况下插入新的元素.
[python]
>>> 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]
2.3.3 列表方法
方法可以这样进行调用
对象·方法(参数)
1. append
[python]
>>> #append方法用于在列表末尾追加新的对象
>>> lst = [1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
2. count
[python]
>>> #count方法统计某个元素在列表中出现的次数
>>> ['to','be','or','not','to','be'].count('to')
2
>>> x = [1,2],1,1,[2,1,[2,2]]
>>> x.count(1)
2
>>> x.count([1,2])
1
3. extend
[python]
>>> #extend方法可以在列表的末尾一次性追加另一个序列中的多个值
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
4.index
[python]
>>> #index方法用于从列表中找出某个值第一个匹配项的索引位置
>>> knights = ['We','are','the','knights','who','say','ni']
>>> knights.index('who')
4
>>> knights[4]
'who'
5. insert
[python]
>>> #insert方法用于将对象插入到列表中
>>> numbers = [1,2,3,5,6,7]
>>> numbers.insert(3,'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
6. pop
[python]
>>> #pop方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值
>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2]
7.remove
[python]
>>> #remove方法用于移除列表中某个值的第一个匹配项
>>> x = ['to','be','or','not','to','be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
8. reverse
[python]
>>> # reverse方法将列表中的元素反向存放
>>> x = [1,2,3]
>>> x.reverse()
>>> x
[3, 2, 1]
9. sort
[python]
>>> #sort方法用于在原位置对列表进行排序
>>> x = [4,5,6,1,7,9]
>>> x.sort()
>>> x
[1, 4, 5, 6, 7, 9]
注意:sort方法调用过后,x的序列就是已经排序的,无法回到原来状态
[python]
>>> x = [4,5,6,1,7,9]
>>> y = sorted(x)
>>> x
[4, 5, 6, 1, 7, 9]
>>> y
[1, 4, 5, 6, 7, 9]
10.高级排序
[python]
>>> cmp(42,32)
1
>>> cmp(99,100)
-1
>>> cmp(10,10)
0
>>> numbers = [5,2,7,9]
>>> numbers.sort(cmp)
>>> numbers
[2, 5, 7, 9]
[python]
>>> x = [4,5,6,1,7,9]
>>> x.sort(reverse=True)
>>> x
[9, 7, 6, 5, 4, 1]
2.4 元组:不可变序列
元组和列表一样,也是一种序列。唯一的不同是元组不能修改。
[python]
>>> 42,#实现一个值的元组。实现方法有些奇特---必须加个逗号,即使只有一个值
- (42,)
下面的一个例子体现了逗号的神奇:
[python]
>>> 3*(40+2)
126
>>> 3*(40+2,)
(42, 42, 42)
2.4.1 tuple函数
tuple函数的功能与list函数基本上是一样的:以一个序列操作为参数并把它转换为元组。如果参数就是元组,那么该参数就会原样返回。
[python]
>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('abc')
('a', 'b', 'c')
>>> tuple((1,2,3))
(1, 2, 3)
2.4.2 基本元组操作
[python]
>>> x = 1,2,3
>>> x[1]
2
>>> x[0:2]
(1, 2)
2.4.3 那么,意义何在
a.元组可以映射(和集合的成员)中当作键使用---而列表则不行。
b.元组作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理。
2.5 小结
重点内容:序列、成员资格、方法。
2.5.1 本章的新函数
[python]
cmp(x,y) #比较两个值
len(seq) #返回序列的长度
list(seq) #把序列转换成列表
max(args) #返回序列或者参数集合中的最大值
min(args) #返回序列或者参数集合中的最小值
reversed(seq) #对序列进行反向迭代
sorted(seq) #返回已排序的包含seq所有元素的列表
tuple(seq) #把序列转换成数组