加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python的索引详解

(2014-12-23 16:57:38)
标签:

元素

代码

步长

序列

示例

分类: Python
索引

序列中的所有元素都是有编号的——从0开始递增。这些元素可以通过编号分别访问,如下例所示:
  1. >>> greeting = 'Hello'>>> greeting[0]'H'
复制代码

注意 字符串就是一个由字符组成的序列。索引0指向第1个元素,在这个例子中就是字母H。

这就是索引。可以通过索引获取元素。所有序列都可以通过这种方式进行索引。使用负数索引时,Python会从右边,也就是从最后1个元素开始计数。最后1个元素的位置编号是 1(不是 0,因为那会和第1个元素重合):
  1. >>> greeting[-1]'o'
复制代码


字符串字面值(就此而言,其他序列字面量亦可)能够直接使用索引,而不需要一个变量引
用它们。两种做法的效果是一样的:
  1. >>> 'Hello'[1]
  2. ' e'
复制代码
如果一个函数调用返回一个序列,那么可以直接对返回结果进行索引操作。例如,假设你只
对用户输入年份的第4个数字感兴趣,那么,可以进行如下操作:
  1. >>> fourth = raw_input('Year: ')[3]
  2. Year: 2005
  3. >>> fourth
  4. ' 5'
复制代码
代码清单2-1是一个示例程序,它要求输入年、月(1~12的数字)、日(1~31),然后打印
出相应日期的月份名称,等等。

索引示例
# 根据给定的年月日以数字形式打印出日期
  1. months = [
  2. 'January',
  3. 'February',
  4. 'March',
  5. 'April',
  6. 'May',
  7. 'June',
  8. 'July',
  9. 'August',
  10. 'September',
  11. 'October',
  12. 'November',
  13. 'December'
  14. ]
  15. # 以1~31的数字作为结尾的列表
  16. endings = ['st', 'nd', 'rd'] + 17 * ['th'] \
  17. + ['st', 'nd', 'rd'] + 7 * ['th'] \
  18. + ['st']
  19. year = raw_input('Year: ')
  20. month = raw_input('Month (1-12): ')
  21. day = raw_input('Day (1-31): ')
  22. month_number = int(month)
  23. d
  24. ay_number = int(day)
  25. #记得要将月份和天数减1,以获得正确的索引
  26. month_name = months[month_number-1]
  27. ordinal = day + endings[day_number-1]
  28. p rint month_name + ' ' + ordinal + ', ' + year
复制代码
以下是程序执行的一部分结果:
  1. Year: 1974
  2. Month (1-12): 8
  3. Day (1-31): 16
  4. August 16th, 1974
复制代码

分片

与使用索引来访问单个元素类似,可以使用分片操作来访问一定范围内的元素。分片通过冒
号相隔的两个索引来实现:
  1. >>> tag = 'Python web site'
  2. >>> tag[9:30]
  3. 'http://www.python.org'
  4. >>> tag[32:-4]
  5. ' Python web site'
复制代码

分片操作对于提取序列的一部分是很有用的。而编号在这里显得尤为重要。第1个索引是需
要提取部分的第1个元素的编号,而最后的索引则是分片之后剩下部分的第1个元素的编号。请参
见如下代码:
  1. >>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  2. >>> numbers[3:6]
  3. [4, 5, 6]
  4. >>> numbers[0:1]
  5. [ 1]
复制代码

简而言之,分片操作的实现需要提供两个索引作为边界,第1个索引的元素是包含在分片内
的,而第2个则不包含在分片内。

1. 优雅的捷径
假设需要访问最后3个元素(根据先前的例子),那么当然可以进行显式的操作:
  1. >>> numbers[7:10]
  2. [ 8, 9, 10]
复制代码
现在,索引 10指向的是第11个元素——这个元素并不存在,却是在最后一个元素之后。明
白了吗?

在,这样的做法是可行的。但是,如果需要从列表的结尾开始计数呢?
  1. >>> numbers[-3:-1]
  2. [ 8, 9]
复制代码
看来并不能以这种方式访问最后的元素。那么使用索引0作为最后一步的下一步操作所使用
的元素,结果又会怎样呢?
  1. >>> numbers[-3:0]
  2. [ ]
复制代码
这并不是我们所要的结果。实际上,只要分片中最左边的索引比它右边的晚出现在序列中(在
这个例子中是倒数第3个比第1个晚出现),结果就是一个空的序列。

幸好,可以使用一个捷径:
如果分片所得部分包括序列结尾的元素,那么,只需置空最后一个索引即可:
  1. >>> numbers[-3:]
  2. [ 8, 9, 10]
复制代码
这种方法同样适用于序列开始的元素:
  1. >>> numbers[:3]
  2. [ 1, 2, 3]
复制代码
实际上,如果需要复制整个序列,可以将两个索引都置空:
  1. >>> numbers[:]
  2. [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码
代码清单2-2 是一个小程序, 它会提示输入URL ( 假设它的形式为http://www.somedomainname.com),然后提取域名。

分片示例
  1. # 对http://www.something.com形式的URL进行分割
  2. url = raw_input('Please enter the URL: ')
  3. domain = url[11:-4]
  4. p rint "Domain name: " + domain
复制代码
以下是程序运行的示例:
  1. Please enter the URL: http://www.python.org
  2. Domain name: python
复制代码

2. 更大的步长
进行分片的时候,分片的开始和结束点需要进行指定(不管是直接还是间接)。而另外一个
参数(在python 2.3 加入到内建类型)——步长(step length)——通常都是隐式设置的。在普通
的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束
点之间的所有元素。
  1. >>> numbers[0:10:1]
  2. [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
复制代码
在这个例子中,分片包含了另外一个数字。没错,这就是步长的显式设置。如果步长被设置
为比1大的数,那么就会跳过某些元素。例如,步长为2的分片包括的是从开始到结束每隔1个的
元素。
  1. >>> numbers[0:10:2]
  2. [1, 3, 5, 7, 9]
  3. numbers[3:6:3]
  4. [ 4]
复制代码

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有