序列概览

在Python中有六种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。在这里暂时只讨论列表和元组。列表和元组的主要区别在于:列表可以修改,元组(不可变)不能

1. 通用序列操作

所有的序列都可以进行某些特定的操作。这些操作包括:

  • 索引(indexing)
  • 分片(sliceing)
  • 加(adding)
  • 乘(multiplying)
  • 检查某个元素是否属于这序列(index)
  • 计算序列长度(len)
  • 找出最大元素和最小元素(min/max)

1.1 索引

序列中所有元素都是有编号的,索引从0开始递增。使用负数索引时,Python会从右边开始计数(-1指的是序列最右边的元素)

 # -- coding: utf-8 --
fruit = 'apple'
# 输出:a
print fruit[0]
# 输出:e
print fruit[-1]

1.2 分片

除了可以使用索引访问当个元素,还可以使用分片操作来访问一定范围内元素。分片操作需要两个索引来作为边界,第一个索引的元素是包含在分片内的,而第二个则不包含(这是Python的惯例)。

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[4, 5, 6]
print numbers[3:6] # 输出:[2, 3, 4, 5]
print numbers[1:-5]

1.2.1 序列分片语法糖

分片中的第二个索引是不包含在返回的分片内的,如果我们需要将一个序列最后的元素包含在分片中该如何操作呢?很简单:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[8, 9, 10]
# 注意:序列中最大的索引为9,而分片中的第二个索引为10
print numbers[7:10]

Python同时为提供了为序列进行分片的语法糖,如下示例:获取最后3位元素:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[8, 9, 10]
print numbers[-3:]

获取序列前3个元素:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[1, 2, 3]
print numbers[:3]

获取整个序列:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print numbers[:]

1.2.2 分片中的步长

在进行分片的时候开始和结束点需要进行指定(显式或隐式)。而另一个参数——步长(setp length)通常都是隐式设置的,默认值为1。如果步长为1:分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。例 如,下面两个表达式输出的值相等:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print numbers[0:10:1] # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print numbers[0:10]

步长也支持下面的简写形式:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[1, 5, 9]
print numbers[::4]

步长不能为0,但是可以为负数 —— 即从右到左提取元素。使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。如下:

 # -- coding: utf-8 --
numbers = [1,2,3,4,5,6,7,8,9,10] # 输出:[7, 6, 5]
print numbers[6:3:-1] # 输出:[10, 8, 6, 4, 2]
print numbers[::-2] # 输出:[6, 4, 2]
print numbers[5::-2] # 输出:[10, 8]
print numbers[:5:-2]

1.3 序列相加

可以使用加号对两个类型相同的序列进行连接操作,如下:

 # -- coding: utf-8 --
numbers1 = [1,2,3]
numbers2 = [4,5,6] # 输出:[1, 2, 3, 4, 5, 6]
print numbers1 + numbers2

1.4 乘法

使用数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复n次。初始化一个长度为10的列表,每个元素的值为None(None为Python内建值,表示:这里什么也没有)可以这样:

 # -- coding: utf-8 --
sequence = [None] * 10 # 输出:[None, None, None, None, None, None, None, None, None, None]
print sequence

1.5 成员资格

可以使用in运算符判断一个对象是否为某个序列的成(元素),如下:

 # --- coding:utf-8 ---
permissions = 'rw'
fruits = ['apple','peach','grape'] # 输出:True
print 'w' in permissions # 输出:True
print 'apple' in fruits # 输出:False
print 'orange' in fruits

1.6 长度、最小值和最大值

Python的内建函数:len/min/max的作用分别是:返回序列中包含元素的数量,返回序列中最小和最大元素。如下:

 # -- coding: utf-8 --
numbers = [-1,21,89] # 输出:3
print len(numbers) # 输出:-1
print min(numbers) # 输出:89
print max(numbers)

2. 列表

列表是可变的(mutable),且提供很多有用的函数。

2.1 list函数

通过使用list函数可以将字符串转换为一个序列。(注意:list函数适用于所有类型的序列,而不只是字符串),如下:

 # -- coding: utf-8 --
python = list('python') # 输出:['p', 'y', 't', 'h', 'o', 'n']
print python

2.2 基本的列表操作

列表可以使用所有适用于序列的标准操作,如索引、分片、连接和乘法。

改变列表:元素赋值

 # --- coding: utf-8 ---
x = [1,1,1] # 改变索引1元素的值
x[1] = 2 # 输出2
print x[1]

删除元素

 # -- coding: utf-8 --
fruits = ['apple','orange','banana'] # 使用del语句删除元素
del fruits[1] # 输出:['apple', 'banana']
print fruits

分片赋值

通过分片赋值可以:一次为多个元素赋值、插入元素、删除元素,如下:

 # -- coding: utf-8 --
name = list('perl')
# 输出:['p', 'e', 'r', 'l']
print name # 一次为多个元素赋值
name[2:] = list('ar') # 输出:['p', 'e', 'a', 'r']
print name # 通过分片赋值插入元素
numbers = [1,5]
numbers[1:1] = [2,3,4] # 输出:[1, 2, 3, 4, 5]
print numbers #通过分片赋值删除元素
numbers[1:4] = [] # 输出:[1, 5]
print numbers

2.3 列表方法

更多列表的使用方法和API,请参考Python文档:http://docs.python.org/2/library/functions.html#list

append:用于在列表末尾追加新对象:

 # -- coding: utf-8 --

 # append函数
lst = [1,2,3]
lst.append(4)
# 输出:[1, 2, 3, 4]
print lst

count:用于统计某个元素在列表中出现的次数:

 # count函数
temp_str = ['to','be','not','to','be']
# 输出:2
print temp_str.count('to')

extend:可以在列表末尾一次性追加另一个序列中的多个值,和连接操作不同,extend方法是修改了被扩展的序列(调用extend方法的序列),而原始的连接操作返回的是一个全新的列表

 # extend函数
a = [1,2,3]
b = [4,5,6]
a.extend(b)
#输出:[1, 2, 3, 4, 5, 6]
print a
# 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
print a + [7,8,9]
# 输出:[1, 2, 3, 4, 5, 6]
print a

index:用于从列表中找出某个值第一个匹配项的索引位置

 # index函数
knights = ['we','are','the','knights','who','say','ni']
# 输出:4
print knights.index('who')
# 抛出异常:ValueError: 'me' is not in list
print knights.index('me')

insert:用于将对象插入到列表中

 # insert函数
numbers = [1,2,3,5,6]
numbers.insert(3,'four')
# 输出:[1, 2, 3, 'four', 5, 6]
print numbers

pop:移除列表中的一个元素(默认是最后一个),并且返回该元素的值。通过pop方法可以实现一种常见的数据结构——栈(LIFO,后进先出)。

 # pop函数
x = [1,2,3]
x.pop()
# 输出:[1, 2]
print x
y = x.pop(0)
# 输出:[2]
print x
# 输出:1
print y

remove:移除列表中某个值的第一个匹配项

 # remove函数
x = ['to','be','not','to','be']
x.remove('to')
# 输出:['be', 'not', 'to', 'be']
print x
# 移除列表没有的元素会抛出异常
x.remove('too')

reverse:将列表中的元素反向存放

 # reverse函数
x = [1,2,3]
x.reverse()
# 输出:[3, 2, 1]
print x

sort:对列表进行排序。注意:sort函数时没有返回值的(None),它作用于源序列。可以通过sorted函数来获取已排序的列表副本。

 # sort函数
x = [3,1,2,7,6,9,5,4,8]
y = x[:]
z = x
y.sort()
# 输出:[3, 1, 2, 7, 6, 9, 5, 4, 8]
print x
# 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
print y
# 输出:[3, 1, 2, 7, 6, 9, 5, 4, 8]
print z

cmp(x,y):通过自定义比较函数(compare),可以实现自定义排序

3. 元组:不可变序列

元组和列表最大的区别在于:元组不能修改。

3.1 创建元组

创建元组很简单,只需要将元素用括号(可选)括起来,并使用逗号分隔符(即使只有一个元素)来分隔各个元素即可:

 # -- coding: utf-8 --
fruits = ('apple','orange','banana')
none_tuple = ()
fruits_1 =('apple',) # 输出:<type 'tuple'>
print type(fruits)
print type(none_tuple)
print type(fruits_1)

3.2 使用tuple函数

通过tuple函数可以将一个序列转换为元组。如下:

 # -- coding: utf-8 --
temp_tuple = tuple([1,2,3]) # 输出:(1, 2, 3)
print temp_tuple
# 输出:('a', 'b', 'c')
print tuple('abc')

3.3 基本元组操作

由于元组是不可变的,所有没有提供像列表一样的函数,基本元组操作就是创建和访问。同样,元组作为序列的一种,也支持分片:

 # -- coding: utf-8 --
temp_tuple = tuple([1,2,3]) # 输出:1
print temp_tuple[0]
# 输出:(1, 2)
print temp_tuple[0:2]

3.4 那些地方需要使用元组

  • 元组可以在映射(和集合的成员)中作为键(key)使用,而列表不行
  • 元组作为很多内建函数和方法的返回值存在

参考资料&进一步阅读

《Python基础教程》

《Learn Python The Hard Way, 2nd Edition》

http://www.pythondoc.com/pythontutorial27/index.html

【循序渐进学Python】2. Python中的序列——列表和元组的更多相关文章

  1. Python语言之数据结构1(序列--列表,元组,字符串)

    0.序列 列表,元组,字符串都是序列. 序列有两个特点:索引操作符和切片操作符.索引操作符让我们可以从序列中抓取一个特定项目.切片操作符让我们能够获取序列的一个切片,即一部分序列. 以字符串为例: 1 ...

  2. Python数据类型-03.序列-列表和元组

    本文主要记录关于Python序列中列表和元组的定义特点和常用方法 1.序列(sequence) 1.1.序列的定义 序列是一组有顺序的元素的集合(其实是是对象的集合,后期会引入“对象”这个概念)序列包 ...

  3. 【python】实践中的总结——列表『持续更新中』

    2016-04-03 21:02:50 python list的遍历 list[a::b]   #从list[a] 开始,每b个得到一个元组,返回新的list 举个例子: >>> l ...

  4. Python中字符串、列表、元组、集合、字典中的一些知识,有些不太常见

    ————————笔记——————————# 字符串1. 字符串是不可变的.2. 字符串切片输出:`[start:end:step]`.使用`a[::-1]`倒序输出字符串.3. `str.split( ...

  5. python 之路 《三》列表与元组

    我也试着把我写的东西给我的一些同学看,其实这只是我的经验还是比较建议先看书,或者在网上找相关的教学视频有了一定的基础之后再来看我写的文章,将我的经验与自己所学的知识相结合这样才会有所提高.有的同学建议 ...

  6. Python基础 数字、字符串、列表、元组、字典

    Number(数字)---> int.float.complex(复数) class int 在Python3中,整形(int)就是常见的整数:1,100,500,1000...... 浮点型( ...

  7. python基础教程第2章——列表与元组笔记

    1.序列是Python中最基本的数据结构.序列中的每个元素被分配一个序列号——元素的位置,也称索引,第1个索引是0,第2为1,以此类推.序列中的最后1个元素为-1,倒数第2个位-2. python中有 ...

  8. Python入门笔记——(2)列表和元组

    一.序列 python包含6种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.序列中每个元素被分配一个序号即索引,第一个索引为0,第二个为1,以此类推.也可以 ...

  9. Python开发——3.基本数据类型之列表、元组和字典

    一.列表(list) 1.列表的格式 li = [11,22,"kobe",["lakers","ball",11],(11,22,),{& ...

随机推荐

  1. 【转帖】驳Jan Baan关于BPM是ERP走向没落起点的说法

    驳Jan Baan关于BPM是ERP走向没落起点的说法 Jan Bean在接受畅享网访问的时候提到“BPM是ERP走向没落的一个起点”.“BPM终将取代ERP”,让笔者这样一个在ERP行业待了接近十年 ...

  2. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  3. chrome https添加信任

    在浏览器地址栏输入:chrome://net-internals/#hsts 然后到Add domain下,Domain添上诸如google.com和google.com.hk ,并勾选Include ...

  4. 优先队列求解Huffman编码 c++

    优先队列小析      优先队列的模板: template <class T, class Container = vector<T>,class Compare = less< ...

  5. cmd实用命令

    1.netstat 查看电脑端口状况 实际应用举例:查看某软件坚监听的电脑端口. 在任务管理器中选择列...,打开PID的显示.在这里查看某个应用程序的线程ID是多少.例如QQ:4904. 运行,cm ...

  6. css3彩色进度条

    <html>    <head>        <title>progress</title>        <script type=" ...

  7. PLSQL Developer 出64位版了

    在win64环境上,一般安装oracle客户端都是64位的了,Toad 也是64位的,但是PLSQL Developer 还是32位的,只能单单为它装一个32位的oracle 客户端,现在退出64位, ...

  8. WebKit内核分析之Page

    参考地址:http://blog.csdn.net/dlmu2001/article/details/6213377 注:本系列博客是在原博主博客基础上增加了自己的理解和片段,可以看源博文获得清晰的结 ...

  9. 谈谈对从业IT行业看法

    做后端开发也有五年了,从工厂到IT行业转化很大,当然最后离职的工厂想也没想过会写代码为生. 是什么变动会让我走入这一行呢? 1.思想作怪 *我当时就想,我认为不应该一辈子只做这狗屎事,起码在当时看来就 ...

  10. VPN理论简单介绍(转载)

    标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...