Python 表list, 元组tuple, 字典dict

  Python中有三种重要而且非常好用的数据类型:list, tuple, dict(表,元组,字典)

        其中,list与tuple非常像,不过tuple中的数据不能修改。这三种数据类型不但可以单独使用,还可以互相嵌套使用,非常方便。在读写文件时,list也被广泛使用(使用形如:for l in list)。dict一般是使用键值对(key-value pair)来定义的,而且不能根据下标寻找数据,只能依靠key来找value(根本原因是dict是个无序不重复元素集set). 键值对使用形如key:value的形式定义;也可以直接使用value定义,这时就不能根据key来找value了,而且value不能重复(实际上,这时已经不是dict了,而是变成集合set了)。

        list与tuple都是序列(sequence),所以序列类型操作符均可以用:成员关系操作符(in, not in),连接操作符(+),重复操作符(*),切片操作符([], [:], [::])。 

        tuple的数据其实也不是一定不可变的,只是tuple中不能增加或减少数据,不能改变其中不能变化的数据类型,但如果item是可以改变的类型,如list,则可以改变list的数据,只是不能将list类型改变成其他的类型:

[python]  view plain copy
  1. >>> t1=([1,2,3],'s','d')  
  2. >>> t1  
  3. ([123], 's''d')  
  4. >>> t1[0].append(4)  
  5. >>> t1  
  6. ([1234], 's''d')  

方法:

        作为高级数据类型,它们也有各自的函数,即方法:(Python3.3)

[python]  view plain copy
  1. #list相关  
  2.   
  3. list=['1','2','3']  
  4. list.append('4'#list追加数据  
  5. list.insert(1,'23'#在下标为1处,增加数据‘23’,原下标1出的数据顺序后移一位  
  6. list.remove('1'#删除list中数据'1',如果数据在list中不存在,则会报错。与del(list[1])功能类似,只是del是按list下标删除数据,越界也会报错。  
  7. list.pop(1#删除list中下标为1的数据,并返回其值  
  8. list=list+['5'#list连接list  
  9. for nr in list: #list元素遍历  
  10.         print(nr)  
  11.   
  12. list=[12,2,33,24]  
  13. list.sort() #list数据排序(数据必须为整型或浮点型),从小到大  
  14. list.reverse() #list数据顺序反转;如果先使用sort,再使用reverse,则可得到从大到小的数据  
  15.   
  16. list[1#找到list中下标为1的数据  
  17. list[1]=111 #修改下标为1的数据为111  
  18. list.index(1#找到list中数据值为1的数据的下标,如果找不到返回一个ValueError,由于list中数据不允许重复,所以不会对同一个数据出现两个下标  
  19.   
  20. if 2 in list: #判断2是否在list中  
  21.   
  22.   
  23. #tuple相关  
  24. tup=(1,) #一个元素的元组,这是个特殊情况,其他都是正常的,比如,tup=(), tup=(1,2)  
  25. tup=((1,1),[21]) #tuple中可以包含tuple与list,甚至dictionary  
  26. tup[0#找到tuple中下标为0的数据  
  27.   
  28.   
  29. #dictionary相关  
  30. dict={1:'a',2:'b'#使用键值对构成每一个元素  
  31. dict[1]='c' #使用key来修改value,如果没有key=1的value,则相当于给dict增加数据  
  32. <span style="white-space:pre">          </span>#与dict.setdefault(1,'c')相同  
  33. if 1 in dict.keys() #判断1是否是dict的key,dict.keys()返回一个dict的所有keys的list  
  34. dict.get(1,'not exist'#得到dict中key=1的值,如果不存在,则返回'not exist'.'not exist'是默认参数,可以不写。优于dict[1],因为如果不存在key=1是dict.get()不会报错,而dict[1]会引起KeyError  
  35. dict.pop(1#删除key=1的键值对,并返回value,与del(dict[1])功能类似,但del没返回值  
  36. dict.keys() #返回包含dict的所有键的list  
  37. dict.values() #返回包含dict的所有值的list  
  38. dict.items() #返回包含由dict的所有键值对组成的元组的一个list  
  39. sorted(dict) #对dict的keys进行排序,得到排序后的一个list,前提是keys必须都是数字(整型与浮点型可混合)或者字符串  


关于复制:

        list不能使用list_new=list,这样list_new只是相当于是list的一个别名,实际上相当于两个不同的指针指向同一块内存,通过任意一个名字改变了数据,从另一个名字那取得数据也相应的改变了。

        tuple则无所谓,因为tuple本身不能被修改,当使用tup2=tup1后,tup2有了与tup1相同的数据,然后,如果对tup1使用=进行赋值,则相当于将tup1与其原来指向的内存解绑,再绑定到现在新数据所在的内存上,但原数据并未删掉,tup2还是可以指向的(如果使用tup2=tup1[:],则更没有问题了)

        list的复制方法有4种,前3种相同,均是浅复制,最后一种是深度复制。浅复制时,如果list中的item本身也是一个list(或其他数据可变的类型),则对这个item本身只生成一个引用,与使用list_new=list的效果相同;如果想要将这些有嵌套的list完全复制,需要用copy模块中的deepcopy()函数:

[python]  view plain copy
  1. >>> l1=[[1,2,3],'s'#l1中既有嵌套的item,又有未嵌套的,l2,l3,l4,l5分别使用了四种不同的方法对其进行了复制。  
  2. >>> l2=l1[:]  
  3. >>> l3=l1.copy() #list.copy()不是copy模块的函数,而是list自带的方法  
  4. >>> l4=copy.copy(l1) #l4,l5使用前别忘了import copy  
  5. >>> l5=copy.deepcopy(l1)  
  6. >>> l1[0].pop()  
  7. 3  
  8. >>> l1[1]='a'  
  9. >>> l1  
  10. [[12], 'a']  
  11. >>> l2  
  12. [[12], 's']  
  13. >>> l3  
  14. [[12], 's']  
  15. >>> l4  
  16. [[12], 's']  
  17. >>> l5  
  18. [[123], 's']  

        dict的复制有list几乎相同,只是dict不能使用dict[:]切片操作,因为dict不是序列型。

其他:

        tuple可以用于多元赋值:

[python]  view plain copy
  1. >>> x,y,z=1,2,3 #实际上=左右都是元组,各自赋值,=两边均可加(),为了避免一些可能的副作用,建议显式的添加()  
  2. >>> print(x,y,z)  
  3. 1 2 3  
  4. >>> (x,y,z)=(4,5,6)  
  5. >>> print(x,y,z)  
  6. 4 5 6  
  7. >>> (x,y)=(y,x) #一个重要用途是实现两个变量互相交换值,相当于C语言中的temp=x; x=y; y=temp;  
  8. >>> print(x,y)  
  9. 5 4  

        由于list与tuple均是序列,均可以使用序列相关的内建函数:sorted(), reversed(), enumerated(), zip(): 

[python]  view plain copy
  1. >>> name=('Wang''Zhao''Liu')  
  2. >>> studentID=(1,2,3)  
  3. >>> for n in sorted(name): #排序  
  4.     print(n,'',end='')  
  5.   
  6. Liu Wang Zhao   
  7. >>> for n in reversed(name): #倒转  
  8.     print(n,'',end='')  
  9.   
  10. Liu Zhao Wang   
  11.   
  12. >>> for i,n in enumerate(name): #可以获得每个item的下标  
  13.     print(i,n,'; ',end='')  
  14.   
  15. 0 Wang ; 1 Zhao ; 2 Liu ;   
  16. >>> for sid,n in zip(studentID,name): #可以将两个序列(studentID, name)中对应项组合到一起,组成一个个的tuple  
  17.     print(sid,n,'; ',end='')  
  18.   
  19. 1 Wang ; 2 Zhao ; 3 Liu ;   
[python]  view plain copy
  1.   

        最后,关于dict的key,list与dict都不能作为这个key,因为key必须是可hash的,即key是不可变类型。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值