列表和元组和集合的区别的区别,使用方法

#我们前面提到列表与元组的区别在于元组的元素不能修改,元组一旦初始化就不能修改。
#不可变的元组有什么意义?因为元组不可变,所以代码更安全。如果可能,能用元组代替列表就尽量用元组。
#示例如下:
1 &&& target=('a','b',['A','B'])
2 &&& target[2][0]='X'
3 &&& target[2][1]='Y'
4 &&& target
5 ('a', 'b', ['X', 'Y'])
6 &&& target[2]
7 ['X', 'Y']
8 &&& target[2][0]
<span style="color: # &&& target[2][1]
<span style="color: # 'Y'
<span style="color: # &&& target[0]
<span style="color: # 'a'
<span style="color: # &&& target[1]
<span style="color: # 'b'
#此处使用了嵌套列表,一个列表包含另一个列表,也可以称为二维数组。一个单一的列表称为一维数组,还有三维、四维等多维数组。
#取二维数组中元素的方式为:先取得二维数组里嵌套的数组,如上例中的target[2],取得的是['A','B'],target[2]是一个一维数组,从一维数组中获取元素是以a[0]的方式获取的,因而从target[2]中取得编号为0的元素的方式是target[2][0]。
#上面的元组定义时有3个元素,分别时'a'、'b'、和一个list列表。为什么元组还可以改变元素呢?
#定义式元组包含的3个元素,如图1所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图1
#当我们把list列表的元素'A'和'B'修改为'X''Y'后,如图2所示:&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图 2&
#表面上看,元组的元素的确时变了,其实变的不是元组的元素,list列表的元素。元组一开始指向的list列表并没有改成别的list列表,所以元组的“不变”是指每个元素的指向永远不变,如指向'a'就不能改为指向'b',指向一个list就不能改成指向其他对象,但指向的list列表本身是可变的。
#理解了“指向不变”后,创建一个内容不变的tuple要怎么做?这是必须保证tuple的每一个元素本身也不能变。
1 &&& target=('肖涛','林徐悦','陈安',['袁威','铿锵工作室'])
2 &&& target[3][2]
#超出索引范围
3 Traceback (most recent call last):
File "&pyshell#147&", line 1, in &module&
target[3][2]
6 IndexError: list index out of range
7 &&& target[3][0]
9 &&& target
<span style="color: # ('肖涛', '林徐悦', '陈安', ['袁威', '铿锵工作室'])
<span style="color: # &&& target[3][0]='邬玲苑'
<span style="color: # &&& target[3][1]='游光野雾'
<span style="color: # &&& target
<span style="color: # ('肖涛', '林徐悦', '陈安', ['邬玲苑', '游光野雾'])
阅读(...) 评论()送分题:列表与元组的区别是?
我的图书馆
送分题:列表与元组的区别是?
作者:刘志军,6年+Python使用经验, 高级开发工程师,目前在互联网医疗行业从事Web系统构架工作题图:forbes.com“列表与元组两种数据类型有哪些区别?”这个问题在初级程序员面试中经常碰到,超出面试官预期的答案往往能加不少印象分,也会给后续面试顺利进行提供一定帮助,这道题主要考察候选人对Python基本数据结构的掌握程度,属于简单类型的送分题,那么该如何来回答才不至于丢分?相同点:都是序列类型回答它们的区别之前,先来说说两者有什么相同之处。list 与 tuple 都是序列类型的容器对象,可以存放任何类型的数据、支持切片、迭代等操作&&& foos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]&&& foos[0:10:2][0, 2, 4, 6, 8]&&& bars = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)&&& bars[1:10:2](1, 3, 5, 7, 9)两者的操作如此相似,Python 为什么还要设计一种叫 tuple 的类型出来呢?这就要从它们的不同之处来寻找答案。不同点一:不可变 VS 可变两种类型除了字面上的区别(括号与方括号)之外,最重要的一点是tuple是不可变类型,大小固定,而 list 是可变类型、数据可以动态变化,这种差异使得两者提供的方法、应用场景、性能上都有很大的区别。列表特有方法:&&& foo = [2,3,1,9,4]&&& foo.sort() # 排序&&& foo.insert(5,10) # 插入&&& foo.reverse() &# 反转&&& foo.extend([-1, -2]) # 扩展&&& foo.remove(10) &# 移除&&& foo.pop() &# 弹出最后一个元素&&& foo.append(5) &# 追加所有的操作都基于原来列表进行更新,而 tuple 作为一种不可变的数据类型,同样大小的数据,初始化和迭代 tuple 都要快于 list&python -m timeit '[1,2,3,4,5]' loops, best of 3: 0.123 usec per loop&python -m timeit '(1,2,3,4,5)' loops, best of 3: 0.0166 usec per loop同样大小的数据,tuple 占用的内存空间更少&&& foo = tuple(range(1000))&&& bar = list(range(1000))&&& foo.__sizeof__()8024&&& bar.__sizeof__()9088原子性的 tuple 对象还可作为字典的键&&& foo = (1,(2,3))&&& d = {foo: 1}&&& bar = (1, [2,3]) # 非原子性tuple,因为元组中包含有不可哈希的list&&& d = {bar: 1}Traceback (most recent call last): &File '', line 1, in TypeError: unhashable type: 'list'不同点二:同构 VS 异构tuple 用于存储异构(heterogeneous)数据,当做没有字段名的记录来用,比如用 tuple 来记录一个人的身高、体重、年龄。person = ('zhangsan', 20, 180, 80)比如记录坐标上的某个点point = (x, y)而列表一般用于存储同构数据(homogenous),同构数据就是具有相同意义的数据,比如下面的都是字符串类型['zhangsan', 'Lisi', 'wangwu']再比如 list 存放的多条用户记录[('zhangsan', 20, 180, 80), ('wangwu', 20, 180, 80)]数据库操作中查询出来的记录就是由元组构成的列表结构。因为 tuple 作为没有名字的记录来使用在某些场景有一定的局限性,所以又有了一个 namedtuple 类型的存在,namedtuple 可以指定字段名,用来当做一种轻量级的类来使用。来说说你在面试中遇到的问题吧,有没有奇葩的?
馆藏&71385
TA的最新馆藏
喜欢该文的人也喜欢python列表与元组详解实例_python
作者:用户
本文讲的是python列表与元组详解实例_python,
在这章中引入了数据结构的概念。数据结构是通过某种方式组织在一起的数据元素的集合。在python中,最基本的数据结构就是序列。序列中的每个元素被分配一个序号,即元素的位置,也被称为索引。注意:第一个索引是0。1.序列概览python有6种内
在这章中引入了数据结构的概念。数据结构是通过某种方式组织在一起的数据元素的集合。在中,最基本的数据结构就是序列。序列中的每个元素被分配一个序号,即元素的位置,也被称为索引。注意:第一个索引是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 pTrue&&& user =["a","b","c"]&&& raw_input('Enter:') in userEnter:aTrue
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 appendappend方法用于在列表末尾追加新的对象:
复制代码 代码如下:
&&& lst = [1,2,3]&&& lst.append(4)&&& lst[1,2,3,4]
注意:append方法不是简单地返回一个修改过的新列表,而是直接修改原来的列表。3.2.2 countcount方法统计某个元素在列表中出现的次数:
复制代码 代码如下:
&&& x =[[1,2],1,1,[1,2,[1,2]]]&&& x.count(1)2
3.2.3 extendextend方法可以在列表的末尾一次性追加另一个序列中的多个值。注意:extend方法和连接操作(+)最主要的区别在于:extend方法修改了被扩展的序列,而连接操作会返回一个全新的列表。3.2.4 indexindex方法用于从列表中找出某个值第一次匹配项的索引位置:
复制代码 代码如下:
&&& knights = ['we','are','the','knights']&&& knights.index('the')2&&& knights.index("hi")ValueError:list.index(x):x not in list
当匹配项没有被找到时,会引发一个异常。3.2.5 insertinsert方法用于将对象插入到列表中:
复制代码 代码如下:
&&& 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 poppop方法会移除列表中的一个元素,并且放回该元素的值,它是唯一一个既能修改列表又能返回元素值的列表方法:
复制代码 代码如下:
&&& 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 reversereverse方法将列表中的元素反向存放:
复制代码 代码如下:
&&& x = [1,2,3]&&& x.reverse()&&& x[3,2,1]
3.2.9 sortsort方法用于在原位置对列表进行排序,意味着改变原来的列表,而不是简单地返回一个已排序的列表副本。如果想要得到一个排序而不改变原来的数值,那就需要先赋值再排序:
复制代码 代码如下:
&&& 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 列表转元组、python 元组 列表、python元组转换为列表、python列表和元组、python 列表变元组,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
IT采购开年惠,百款产品5折起,新购满额再返最高6000!
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!列表和元组的区别是什么?_百度知道
列表和元组的区别是什么?
元组适用场景很多,比方说,如果需要在方法里返回多个对象。元组通常用在使语句或用户定义的函数能够安全的采用一组值的时候,即被使用的元组的值不会改变。元组可以嵌套。即你不能修改元组。元组通过圆括号中用逗号分隔的项目定义。Java里的做法是创建JavaBean已包含多个返回值,元组也是不可变的;但是与列表不同,元组可以包含不同类型的元素。例如列表只能写成List[Int]或者List[String],但是元组可以同时拥有Int和String、下划线和基于1的索引访问其中的元素,可以用点号。列表中的项目应该包括在方括号中.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目,这样python就知道你是在指明一个列表。一旦你创建了一个列表,不过元组是不可变的。列表控件可使用四种不同视图显示项目。可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 比如使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2;只要把元组实例化需要的对象放在括号里,并用逗号分隔即可。由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的。元组实例化之后,你就可以添加,删除,或者是搜索列表中的项目。而且做起来也很简单。与列表一样。列表是可以嵌套的。元组元祖和列表十分相似,Scala里可以仅返回元组。比如ComponentOne[1]&&的List控件有齐全的列表框和多列的下拉列表框,拆分样式等.可管理列表中项目的排序方法和选定项目的外观。元组在Scala语言中是一个非常有用的容器对象列表list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。列表中的项目
采纳率:25%
为您推荐:
其他类似问题
您可能关注的内容
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 元组和字典的区别 的文章

 

随机推荐