4. Python脚本学习笔记四列表
本篇名言:“我们给了生活多少耕耘,生活就会赏赐我们多少果实。我们给了生活多少懒惰,生活就会回敬我们多少苦涩。”
序列是最基本的数据结构,这个好像哪里都有。序列中的每个元素被分配一个序号,即元素的位置,也称为索引。
列表的各个元素通过逗号分隔。
>>> edward=['Edward',42]
>>> john=['john',50]
>>> database=[edward,john]
>>> database
[['Edward', 42], ['john', 50]]
Python之中有一种名为容器containter的数据结构,容器基本上是包含其他对象的任意对象。序列(列表和元素)和映射(字典)是两类主要的容器。序列中每个元素都有自己的编号,映射中每个元素有一个名字(也叫键)。
1. 通用序列操作
1.1 索引
序列中的所有元素都是有编号的,从0开始递增。
>>> greeting='hello'
>>> greeting[0]
'h'
>>> greeting[-1]
'o'
字符串就是一个由字符组成的序列。索引0指向第1个元素,-1指向最后一个元素。
索引示例,摘自书本《Python基础教程第二版》
# Print out a date, given year, month, and day as numbers
months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
]
# A list with one ending for eachnumber from 1 to 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)
# Remember to subtract 1 frommonth and day to get a correct index
month_name =months[month_number-1]
ordinal = day +endings[day_number-1]
print month_name + ' ' + ordinal+ ', ' + year
执行结果:
Year: 2015
Month(1-12): 10
Day(1-31): 3
October 3rd,2015
示例说明:创建了2个数组,Months,endings
输入年,月,日
然后将月和日转换成int使用索引得到名字。
1.2 分片
使用分片操作来访问一定范围内的元素。
>>> tag='<ahref="www.baidu.com</a>'
>>> tag[10:200]
'ww.baidu.com</a>'
取10到200的字符,当然数量超过字符串最大后要看实际拥有的。
>>> number=[1,2,3,4,5,6,7,8]
>>> number[0,1]
>>> number[0:1]
[1]
注意:0:1是不取1的。
从倒数第三个到结束
>>> number[-3:]
[6, 7, 8]
从开始到第三个元素
>>> number[:3]
[1, 2, 3]
挑选奇数位的元素
>>> number[::2]
[1, 3, 5, 7]
其中2就是步长的意思。
步长为负数表示从右到左开始。
>>> number[::-2]
[8, 6, 4, 2]
1.3 序列相加
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
当然,列表和字符串是无法连接在一起的。
1.4 乘法
>>> 'python'*5
'pythonpythonpythonpythonpython'
>>> [4]*10
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
如果需要占用10个元素空间。可以使用none,是一个Python 的内键值。
>>> sequence=[None]*10
>>> sequence
[None, None, None, None, None, None, None,None, None, None]
使用如下示例看下序列乘法示例:
# Prints a sentence in a centered"box" of correct width
# Note that the integer division operator(//) only works in Python
# 2.2 and newer. In earlier versions,simply use plain division (/)
sentence = raw_input("Sentence:")
screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2
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的时候将字符串进行了乘法,最后得到一个很可爱的输出。
1.5 检测成员
检测一个值是否在序列中,使用in运算符。
>>> permission='rwd'
>>> 'w' in permission
True
>>> 'z' in permission
False
示例代码:
#Check a user name and PIN code
database= [
['albert', '1234'],
['dilbert', '4242'],
['smith', '7524'],
['jones', '9843']
]
username= raw_input('Username: ')
pin =raw_input('PIN code: ')
if [username, pin] in database: print 'Access granted'
执行结果如下:
Username: smith
PINcode: 7524
Access granted
1.6 内建函数
常用的是len,max,min函数。
>>>numbers=[100,34,678]
>>>len(numbers)
3
>>>max(numbers)
678
>>>min(numbers)
34
2. 列表
列表是可变的(mutable),可以改变列表的内容。
2.1 List
字符串不能像列表一样被修改,根据字符串创建列表会很有用。
>>>list('hello')
['h', 'e', 'l','l', 'o']
2.2 基本列操作
改变元素
>>> x=[1,1,1]
>>> x[1]=2
>>> x
[1, 2, 1]
删除元素
>>> del x[1]
>>> x
[1, 1]
分片赋值
>>> name=list('Hello')
>>> name
['H', 'e', 'l', 'l', 'o']
>>> name[2:]=list('ar')
>>> name
['H', 'e', 'a', 'r']
也可以用来删除其中的元素
>>> name[1:]=[]
>>> name
['H']
2.3 列表方法
一般来说对象方法的调用如下
对象.方法
2.3.1 Append函数
是增加一个元素
>>>lst=[1,2,3,4]
>>>lst.append(5)
>>> lst
[1, 2, 3, 4, 5]
2.3.2 Count函数
是计算某个值在列表中的数量
>>> lst.count(1)
1
2.3.3 Extend
是扩展列表a,和 a+b的区别是直接赋值给 a,当然我们也可以自己实现的,不过可读性没有extend好。
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
2.3.4 Index方法
>>>knights=['we','are','the','knights','who']
>>> knights.index('who')
4
2.3.5 Insert方法
插入
>>> numbers=[1,2,3,5,6,7]
>>> numbers.insert(3,'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
居然还能实现类似堆栈的功能,蛤蟆也是醉了
>>> numbers.pop()
7
2.3.6 Remove方法
用于移除列表中某个值的第一个匹配项
>>>x=['to','be','or','not','to','be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
Reverse方将将列表中的元素反向存放
>>> x.reverse()
>>> x
['be', 'to', 'not', 'or', 'to']
2.3.7 使用sort进行排序
>>> x=[4,6,2,1,7,9]
>>> x.sort()
>>> x
[1, 2, 4, 6, 7, 9]
如果不想改变原来x的排序可以使用sorted函数
>>>x=[4,6,2,1,7,9]
>>> y=x
>>>y=sorted(x)
>>> x
[4, 6, 2, 1, 7,9]
>>> y
[1, 2, 4, 6, 7,9]
2.3.8 高级排序
可以再sort函数中提供函数来进行排序。
例如按字符串长度进行排序。
>>>x=['aardvark','abalone','acme','add','aerate','okd']
>>>x.sort(key=len)
>>> x
['add', 'okd', 'acme', 'aerate', 'abalone','aardvark']
PS: 参数除了key还有reverse。