python列表与元组详解实例


Posted in Python onNovember 01, 2013

在这章中引入了数据结构的概念。数据结构是通过某种方式组织在一起的数据元素的集合。在python中,最基本的数据结构就是序列。序列中的每个元素被分配一个序号,即元素的位置,也被称为索引。注意:第一个索引是0。
1.序列概览
python有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象。
 这里重点介绍列表和元组。列表和元组主要区别在于,列表可以修改,元组不可修改。一般来说,在几乎所有情况下列表都可以代替元组。
在需要操作一组数值的时候,序列很好用:

Edward = ["Gumby",42]

 同时,序列可以包含其他的序列。如:
Edward = ["Gumby",42]
John = ["Smith",50]
database = [Edward,John]

2. 通用序列操作
所有序列类型都可以进行某些特点的操作,包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度,找出最大元素和最小元素的内建函数。
2.1 索引
序列中的所有元素都是有编号的--从0开始递增。这些元素可以通过编号分别访问:
>>>greeting = "hello"
>>>greeting[0]
'H'

使用负数索引的话,python会从右边,也就是从最后一个元素开始计数,最后一个元素的位置编号是-1!
>>> greeting[-1]
'g'

2.2 分片
分片可以访问一定范围内的元素,通过冒号相隔的2个索引来实现。分片对于提取序列的一部分是很有用的,第一个索引是提取部分的第一个元素编号,最后的索引是分片之后剩下部分的第一个元素编号。
>>> number = [1,2,3,4,5,6,7,8,9,10]
>>> number[3:6]
[4,5,6]
>>> number[0:1]
[1]

2.2.1 优雅的捷径
需要访问最后3个元素,可以这样显式操作:
>>> number[7:10]
[8,9,10]

这里索引10指向的第11个元素不存在,却是在最后一个元素之后。
如果需要从列表结尾开始计数,就是说如果分片所得部分包括序列结尾的元素,那么只需置空最后一个索引:
>>> number[-3:]
[8,9,10]

这种方法适用于序列开始的元素或者显示整个序列:
>>> number[:3]
[1,2,3]
>>> number[:]
[1,2,3,4,5,6,7,8,9,10]

2.2.2 更大的步长
进行分片的时候,分片的开始和结束都需要进行指定,另一个参数-步长,通常是隐式设置的。默认的步长是1。如果显示设置步长为比1大的数,那么会跳过某些元素。
>>> number[0:10:2]
[1,3,5,7,9]
>>> number[3:6:3]
[4]

步长不能为0,但是可以是负数,即从右到左提取元素:
>>> number[10:0:-2]
[10,8,6,4,2]
>>> number[0:10:-2]
[]

上面第二个式子是错误的,使用一个负数作为步长时,必须让开始点大于结束点。
2.3 序列相加
通过使用加号可以进行序列的连接操作:
>>> [1,2,3] + [4,5,6]
[1,2,3,4,5,6]
>>>'hello, ' + 'world'
'hello, world'
>>>[1,2,3] + 'hello'
TypeError:can only concatenate list(not 'string') to list

如上面第三个例子所示,列表和字符串是无法连接到一块的,尽管它们都是序列,但是只有2种相同类型的序列才能进行连接操作。
2.4 乘法
用数字x乘以一个序列会生成新的序列,在新的序列中,原来的序列被重复x次:
[code]
>>> 'python' *5
'pythonpythonpythonpythonpython'
>>> [42] * 5
[42,42,42,42,42]

None,空列表和初始化
空列表可以通过2个中括号进行表示([]),但是如果想创建一个占用十个元素空间,却不包括任何有用内容的列表,我们就需要一个值来代表空值,可以这样做:
>>> sequence = [None] * 10
>>> sequence 
[None,None,None,None,None,None,None,None,None,None]

2.5 成员资格
为了检查一个值是否在序列中,可以使用in运算符。它检查某个条件是否为真,然后返回相应的值(True或False)
>>> p = 'write'
>>> 'w' in p
True
>>> user =["a","b","c"]
>>> raw_input('Enter:') in user
Enter:a
True

2.6 长度,最大最小值
>>> numbers = [10,20,30]
>>> len(numbers)
>>> max(numbers)
>>> min(numbers)
>>> max(1,99)
>>> min(1,99)

上面最后2个例子中,max函数和min函数的参数并不是序列,而是以多个数字直接作为参数。
3.列表:python的“苦力”
3.1 list函数
因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用。ps:list函数适用于所有类型的列表,不只是字符串。
>>> list('hello')
['h','e','l','l','o']

提示:可以用下面的表达式将一个由字符组成的列表转换为字符串:
>>> strs = ‘ '.jion(list)
>>> strs
"h e l l o"

3.2 基本列表操作
方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象。列表提供了几个方法,用于检测或者修改其中的内容。
 3.2.1 append
append方法用于在列表末尾追加新的对象:
>>> lst = [1,2,3]
>>> lst.append(4)
>>> lst
[1,2,3,4]

注意:append方法不是简单地返回一个修改过的新列表,而是直接修改原来的列表。

3.2.2 count
count方法统计某个元素在列表中出现的次数:

>>> x =[[1,2],1,1,[1,2,[1,2]]]
>>> x.count(1)
2

3.2.3 extend
extend方法可以在列表的末尾一次性追加另一个序列中的多个值。
注意:extend方法和连接操作(+)最主要的区别在于:extend方法修改了被扩展的序列,而连接操作会返回一个全新的列表。

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

>>> knights = ['we','are','the','knights']
>>> knights.index('the')
2
>>> knights.index("hi")
ValueError:list.index(x):x not in list

当匹配项没有被找到时,会引发一个异常。

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

>>> numbers = [1,2,3,6]
>>> numbers = insert(3,5)
>>> numbers
[1,2,3,5,6]
>>> numbers[3:3] = [4]
>>> numbers
[1,2,3,4,5,6]

上面最后一个例子中通过分片赋值实现插入,但是可读性不如insert。

3.2.6 pop
pop方法会移除列表中的一个元素,并且放回该元素的值,它是唯一一个既能修改列表又能返回元素值的列表方法:

>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1,2]

3.2.7 remove
 remove方法用于移除列表中某个值的第一个匹配项:
>>> x = ['to','be','to']
>>> x.remove('to')
>>> x
['be','to']
>>> x.remove('kkk')
ValueError:list.remove(x):x not in list

可以看到只有第一次出现的值被移除了,而不在列表中的值是不会移除的。

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

>>> x = [1,2,3]
>>> x.reverse()
>>> x
[3,2,1]

 3.2.9 sort
sort方法用于在原位置对列表进行排序,意味着改变原来的列表,而不是简单地返回一个已排序的列表副本。
如果想要得到一个排序而不改变原来的数值,那就需要先赋值再排序:
>>> x = [4,2,7,1]
>>> y = x[:]
>>> y.sort()
>>> x
[4,2,7,1]
>>>y
[1,2,4,7]

注意:上面的例子中赋值使用的是y=x[:],分片是一种很有效率的复制整个列表的方法。如果简单地把x赋值给y是没有的(y=x),因为这样做就让x和y指向同一个列表了。
另一种获取已排序列表副本的方法是使用sorted函数:
>>> x = [4,5,3,7,2]
>>> y = sorted(x)
>>> x
[4,5,3,7,2]
>>> y
[2,3,4,5,7]
 

 3.2.10 高级排序
如果希望元素能够按照特定的方式进行排序,那么可以通过compare(x,y)的形式自定义比较函数。内建cmp函数提供了比较函数的默认实现方式:
>>> cmp(1,2)
-1
>>> cmp(2,1)
>>> cmp(1,1)
>>> numbers = [5,3,9,7]
>>> numbers.sort(cmp)
>>> numbers 
[3,5,7,9]

sort方法有另外2个可选参数-key和reverse。要使用它们,那就要通过名字来指定。
>>> x = ['a','abc','ab']
>>> x.sort(key=len)
>>> x
['a','ab','abc']
>>> y = [2,4,1,5]
>>> y.sort(reverse)
>>> y
[5,4,2,1]

 4.元组:不可变序列
 创建元组的语法很简单:如果你用逗号分隔了一些值,那么你就自动创建了元组。

>>>1,2,3
(1,2,3)
>>>(1,2,3)
(1,2,3)
>>>()
()
>>>42,
(42,)

如上面最后一个例子,如果要实现一个包括一个值的元组,必须在数值后面加一个逗号。
4.1 tuple函数
tuple将一个序列作为参数并把它转换为元组,如果参数是元组,那么该参数就会被原样返回:
>>> tuple([1,2,3])
(1,2,3)
>>> tuple('abc')
('a','b','c')
>>> tuple((1,2,3))
(1,2,3)

4.2 基本元组操作
元组其实并不复杂,除了创建元组和访问元组元素之外,也没有太多其他操作:
>>>x = 1,2,3
>>>x[1]
2
>>> x[0:2]
(1,2)

元组的分片还是元组,就像列表的分片还是列表一样。

4.3 那么,意义何在
元组是不可替代的:
(1)元组可以在映射中当作键使用,而列表不行。
(2)元组作为很多内建函数和方法的返回值存在。

 

Python 相关文章推荐
Python中with及contextlib的用法详解
Jun 08 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
python flask中静态文件的管理方法
Mar 20 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
python基于物品协同过滤算法实现代码
May 31 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 Python
Python3 合并二叉树的实现
Sep 30 Python
如何基于python实现归一化处理
Jan 20 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
python创建和使用字典实例详解
Nov 01 #Python
python分割和拼接字符串
Nov 01 #Python
python list语法学习(带例子)
Nov 01 #Python
python读取Android permission文件
Nov 01 #Python
Python读写Excel文件的实例
Nov 01 #Python
Python修改Excel数据的实例代码
Nov 01 #Python
Python获取apk文件URL地址实例
Nov 01 #Python
You might like
PHP Document 代码注释规范
2009/04/13 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
Python使用asyncio包处理并发详解
2017/09/09 Python
centos7之Python3.74安装教程
2019/08/15 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python如何调用java类
2020/07/05 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
优秀党支部事迹材料
2014/01/14 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书