Python 元組和集合的特點及常用操作

一、元組的特點:

1、有序的集合

2、通過偏移來取數據

3、屬於不可變的對象,不能在原地修改內容,沒有排序,修改等操作。

tuple支援的方法很少

>>> dir(tuple)  ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
>>> a = (1,2,3)  >>> a[0]  1  >>> a[1:3]  (2, 3)

通過tuple的類型轉換,來修改變數的引用

>>> a = (1,2,3)  >>> b= list(a)  >>> b[0]=5  >>> type(b)  <type 'list'>  >>> b  [5, 2, 3]  >>> a=tuple(b) ###新生成了一個對象,表面上是修改成功了  >>> a  (5, 2, 3)

思考:元組不能改變,那為什麼有列表,還要有元組呢?元組一般當成參數傳遞給方法,而不是傳遞列表,元組不可變的好處,保證數據的安全,比如我們傳給一個不熟悉的方法或者數據介面,確保方法或者介面不會改變我們的數據從而導致程式問題。

#!/usr/bin/python  #coding:utf-8  def info(a):      ""我們不熟悉的方法""  print 'sss %d' % id(a)  a[0]="haha"  return a  a = [1,2,3]  print "start-"  print id(a)  info(a) #一個列表傳給了一個方法,卻改變了這個列表的值,這裡如果是a=(1,2,3)則相對的安全  print a
#!/usr/bin/python  #coding:utf-8  def info(a):      b =a[:] #拷貝會生成一個新的列表對象  print 'sss %d' % id(a)  b[0]="haha"  return a #不會修改列表的值  a = [1,2,3]  print "start-"  print id(a)  info(a)  print a

二、集合:集合是沒有順序的概念。所以不能用切片和索引操作。內置方法set(),接收可迭代的對象,如果對象有__iter__ 屬性,就是可以迭代的對象,如字元串、列表、元組

1、創建集合。set():可變的 ;不可變的frozenset():

2、添加操作: add,update,注意update和add的區別

3、刪除 remove

4、成員關係 in,not in

6、交集,並集,差集 & | –

7、set去重  列表內容元素重複

>>> b=set('abc')  >>> b  set(['a', 'c', 'b'])  >>> b.add('python') #作為一個整體,添加單個對象到集合里  >>> b  set(['a', 'python', 'c', 'b'])  >>> b.update('hello') #打散了,把對象里的每個元素添加到集合里  >>> b  set(['a', 'c', 'b', 'e', 'python', 'h', 'l', 'o'])
>>> b.remove('python')  >>> b.remove('python') #刪除不存在的原始,會有異常  Traceback (most recent call last):    File "<stdin>", line 1, in ?  KeyError: 'python'  >>> b  set(['a', 'c', 'b', 'e', 'h', 'l', 'o'])
>>> 'c' in b  True  >>> 'x' in b  False  >>> 'x' not in b  True
>>> a = set('abcd')  >>> b= set('bcdef')  >>> a & b  #求集合的交集  set(['c', 'b', 'd'])  >>> a | b  #求並集  set(['a', 'c', 'b', 'e', 'd', 'f'])  >>> a - b  #求差集  set(['a'])

##不可變集合,frozenset,不能進行添加,修改和刪除的操作

>>> a = frozenset('bac')  #frozenset是有序的  >>> a.add('a')  Traceback (most recent call last):    File "<stdin>", line 1, in ?  AttributeError: 'frozenset' object has no attribute 'add'  >>> a.remove('a')  Traceback (most recent call last):    File "<stdin>", line 1, in ?  AttributeError: 'frozenset' object has no attribute 'remove'  >>> a  frozenset(['a', 'c', 'b'])

##判斷2個集合是否相等,和元素本身有關,和順序無關。

>>> print set('abc') == set('cba')  True

list 去重的兩種方法

l

iststr = ['haha','gag','hehe','haha']  #for循環  m = []  for i in liststr:      if i not in m:          m.append(i)           print m  ['haha', 'gag', 'hehe']
>>> m = set(liststr)  >>> m  set(['gag', 'hehe', 'haha'])  >>> print list(m)  ['gag', 'hehe', 'haha']

練習:

a = (1,2,3)

一、用2種方法輸出實現下面的結果:

(5,2,3)

>>> a = (1,2,3)  >>> b=list(a)  >>> b[0]=5  >>> a=tuple(b)  >>> a  (5, 2, 3)

2 判斷2是否在元組裡

>>> 2 in a  True

二、集合a = set(['a','b','c'])做下面的操作:

1、添加字元串'jay'到集合a里。

>>> a = set(['a','b','c'])  >>> a.add('jay')  >>> a  set(['a', 'c', 'b', 'jay'])

2、集合b = set(['b','e','f','g']) 用2種方法求集合a 和集合b的並集。

>>> b = set(['b','e','f','g'])  >>> a  set(['a', 'c', 'b', 'jay'])  >>> a|b  set(['a', 'c', 'b', 'e', 'g', 'jay', 'f'])