一、元祖html
元祖的特性結合了字符串和列表java
元祖是用圓括號括起來的,其中的元素之間用逗號(英文半角)隔開。元祖中的元素是任意類型的python對象(包括之後自定義的對象) python
元祖中的元素不可更改,因此修改列表的方法,在元祖中都會失效。git
使用場景:github
元祖比列表操做速度快。若是定義了一個值,而且惟一要用他作的是不斷的遍歷他,那麼請使用元祖代替列表。web
若是對不須要修改的數據進行"寫保護",即該數據是常量,那麼此時也要使用元祖。若是必需要改變這些值,則能夠轉換爲列表修改。shell
元祖能夠在字典(又一種對象類型,後面要講述)中被用做key,可是列表不能夠。字典的key必須是不可變的。元祖自己就是不可改變的,而列表是可變的。ssh
1.1定義元祖:函數
tu1 = tuple() tu2 = (1,) tu3 = (1,23,3,'python')
>>> a = (3)
>>> type(3)
<class 'int'> #定義時要注意的google
1.2索引和切片,與列表相同
>>> t = (1,'23',[123,'abc'],('python','learn')) >>> t[2] [123, 'abc'] >>> t[1:] ('23', [123, 'abc'], ('python', 'learn')) >>> t[2][0] 123 >>> t[3][1] 'learn'
1.3轉換列表
>>> t = (1,'23',[123,'abc'],('python','learn')) >>> tls = list(t) #轉換列表 >>> tls [1, '23', [123, 'abc'], ('python', 'learn')] >>> t_tuple = tuple(tls) #轉換元祖 >>> t_tuple (1, '23', [123, 'abc'], ('python', 'learn'))
1.4方法
dir(tuple) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
二、字典(dictionary)
字典中的"鍵"必須是不可變的數據類型:"值"能夠是任意數據類型
2.1建立字典
>>> mydict1 = {} >>> mydict1 {} >>> mydict2 = {'name':'zhang','site':'bokeyuan','language':'python'} >>> mydict2 {'name': 'zhang', 'site': 'bokeyuan', 'language': 'python'} #"鍵/值對" 前面的叫作(key),後面的叫作值(value)
2.2增長鍵值對
>>> mydict2['name2'] = "taj" #追加鍵值對,內存位置不變,它是可變的 >>> mydict2 {'name': 'zhang', 'site': 'bokeyuan', 'language': 'python', 'name2': 'taj'}
#方法2
>>> name = (["first","Google"],["second","Yahoo"])
>>> type(name)
<class 'tuple'>
>>> website = dict(name)
#或
>>> ad = dict(name = 'tajzhang',ahe = 22)
>>> ad
{'name': 'tajzhang', 'ahe': 22}
#方法3
>>> website = {}.fromkeys(("third","forth"),"facebook")
>>> website
{'third': 'facebook', 'forth': 'facebook'}
2.3訪問字典的值
>>> mydict2 = {'name':'zhang','site':'bokeyuan','language':'python'} >>> mydict2["name"] 'zhang'
2.4基本操做
len(d),返回字典(d)中的鍵值對的數量
d[key],返回字典(d)中的鍵(key)的值
d[key]=value,將值(value)賦給字典(d)中的鍵(key).
del d[key],刪除字典(d)的鍵(key)項(將該鍵值對刪除).
key in d,檢查字典(d)中是否含有鍵爲key的項
2.5字符串格式化輸出
>>> city_code = {"suzhou":"0512","ttangshan":"0315","huangzhaou":"0571"} >>> "Suzhou is a beautiful city, its area code is {suzhou}".format(**city_code)
>>> temp = "<html><head><title>{lang}<title><body><p>My name is {name}.<p><body></head><html>" >>> my = {"name":"qiwsir","lang":"python"} >>> temp.format(**my) '<html><head><title>python<title><body><p>My name is qiwsir.<p><body></head><html>' #實際應用場景
2.6字典的方法
python重要概念:對象有類型,變量無類型
1)copy,複製,表層id()不一樣,若是有多層序列類型,則調用相同id
d1 = d.copy()
2)d("key").remove("value")
3)d.clean() 清空字典爲空字典
4)del d 刪除字典
5)get 經過鍵取值
>>> d = {'lang':'python'} >>> d.get('lang') 'python' >>> d.get('name') #不會報錯,較爲寬容
6)setdefault
>>> d {'lang': 'python'} >>> d.setdefault("lang") #與get相似返回值 'python' >>> d.setdefault("name","tajzhang") #也能夠直接添加鍵值 'tajzhang' >>> d {'lang': 'python', 'name': 'tajzhang'} >>> d.setdefault("name","zhang2") #修改值不生效 'tajzhang' >>> d {'lang': 'python', 'name': 'tajzhang'} >>> d.setdefault('web') #可添加一個空的鍵 >>> d {'lang': 'python', 'name': 'tajzhang', 'web': None}
7)items,keys,values 三種字典擴展類型
>>> dd = {'name':'tajzhang','lang':'python','web':'www.google.com'} >>> dd_kv = dd.items() >>> dd_kv dict_items([('name', 'tajzhang'), ('lang', 'python'), ('web', 'www.google.com')]) >>> type(dd_kv) <class 'dict_items'> >>> dd.keys() dict_keys(['name', 'lang', 'web']) >>> dd.values() dict_values(['tajzhang', 'python', 'www.google.com'])
8)pop,popitems
>>> dd {'name': 'tajzhang', 'lang': 'python', 'web': 'www.google.com'} >>> dd.pop('name') #指定刪除 'tajzhang' >>> dd.pop('name') #不存在則刪除報錯 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'name'
>>> dd {'lang': 'python', 'web': 'www.google.com', 'name': 'zhang2'} >>> dd.popitem() #與listpop方法相似,不指定值隨機刪除(由於字典是無序的),當字典爲空時會報錯 ('name', 'zhang2') #返回一個元祖
9)update更新字典內容
>>> d1 = {"lang":'python'} >>> d2 = {'song':'I dreamed a dream'} >>> d1.update(d2) #把d2內容更新到d1中,d2不變 >>> d1 {'lang': 'python', 'song': 'I dreamed a dream'} >>> d2 {'song': 'I dreamed a dream'}
>>> d2 {'song': 'I dreamed a dream'} >>> d2.update([("name","qiwsir"),("web","itdiffer.com")]) #方法2 >>> d2 {'song': 'I dreamed a dream', 'name': 'qiwsir', 'web': 'itdiffer.com'}
2.7引入深度copy,無論數據多少層都是真複製 不一樣id()內存地址
>>> x = {'lang':['python','java'],'name':'qiwsir'} >>> import copy >>> z = copy.deepcopy(x) >>> z {'lang': ['python', 'java'], 'name': 'qiwsir'} >>> id(x["lang"]) 4339599752 >>> id(z["lang"]) 4339599880
三、集合
集合特色:有的可變 有的不可變;元素無次序,不可重複。
>>> s1 = set("tajzhang") #建立集合 >>> s1 {'h', 'j', 'a', 'g', 'z', 't', 'n'} >>> s2 = set([123,"google","face","book","facebook","book"]) #指定建立 >>> s2 {'google', 'facebook', 123, 'book', 'face'} >>> type(s2) <class 'set'>
>>> s3 = {"facebook",123} #直接建立
>>> s3
{123, 'facebook'}
>>> type(s3)
<class 'set'>
3.1 set經常使用方法
1)add和update
>>> set1 = set() >>> set1 = {'a','i'} >>> type(set) <class 'type'> >>> set1.add('tajzhang') >>> set1 {'tajzhang', 'a', 'i'} #插入數據隨機位置可見是無序的 set2 = set("python") >>> set2.add('[1,2,3]') #沒法插入列表 轉換成字符串格式就能夠了? >>> set2 {'h', '[1,2,3]', 'n', 'tajzhang', 'y', 'o', 'p', 't'}
>>> s1 = set(['a','b']) >>> s1 {'b', 'a'} >>> s2 = set(['github','tajzhang']) >>> s1.update(s2) #追加 >>> s1 {'github', 'tajzhang', 'b', 'a'} >>> s2 {'github', 'tajzhang'} >>> s2 = set(['github','tajzhang']) >>> s1.update(s2) >>> s1 {'github', 'tajzhang', 'b', 'a'} >>> s2 {'github', 'tajzhang'} >>> s2 {'github', 'tajzhang'} >>> s2.update('goo') #文檔描述,這個方法的做用原有的集合自身和其餘的東西構成的新集合來更新原來的集合。能夠理解爲:others指的是做爲參數的不可變對象,將它和原來的集合組成新的集合,用這個心集合代替原來的集合 >>> s2 {'o', 'github', 'tajzhang', 'g'} >>> s2.update((2,3)) >>> s2 {2, 3, 'tajzhang', 'o', 'g', 'github'}
2)pop,remove,discard,clear
>>> b_set {'h', '[1,2,3]', 'n', 'tajzhang', 'y', 'o', 'p', 't'} >>> b_set.pop() 'h' >>> b_set.pop() '[1,2,3]' >>> b_set.pop() #隨機刪除一個元素 'n' >>> b_set {'tajzhang', 'y', 'o', 'p', 't'} >>> b_set.pop('y') #指定刪除會報錯 Traceback (most recent call last): File "<pyshell#45>", line 1, in <module> b_set.pop('y') TypeError: pop() takes no arguments (1 given)
>>> a_set = {"a","tajzhang",'i'} >>> a_set.remove('i') #刪除集合內元素,不在集合內就報錯 >>> a_set {'tajzhang', 'a'} >>> a_set.remove('w') Traceback (most recent call last): File "<pyshell#49>", line 1, in <module> a_set.remove('w') KeyError: 'w' >>> a_set.discard('a') #在集合中就刪除,不然不進行任何操做 >>> a_set {'tajzhang'} >>> a_set.discard('b') >>> a_set {'tajzhang'} >>> a_set.clear() #終極操做清空 >>> a_set set() >>> a_set.clear() >>> bool(a_set) False
3.2不可變集合
用set()來建立的集合都是可修改,可變的,即unhashable的集合。還有一種集合不能原地修改,這種集合的建立方法是用frozenset(),這種集合就是一個凍結的集合是不能修改的,hashable類型
>>> f_set = frozenset("tajzhang") >>> f_set frozenset({'h', 'n', 'z', 'a', 'j', 'g', 't'}) >>> f_set.add("python") Traceback (most recent call last): File "<pyshell#61>", line 1, in <module> f_set.add("python") AttributeError: 'frozenset' object has no attribute 'add' >>> dir(f_set) ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
3.3集合運算
1)元素與集合的關係
元素與集合只有一種關係,元素要麼屬於某個集合,要麼不屬於.
>>> a_set = set("python") >>> a_set {'h', 'n', 'y', 'o', 'p', 't'} >>> "a" in a_set False >>> "h" in a_set True
2)集合與集合關係
假設有兩個集合A、B
(1)A是否等於B,即兩個集合的元素是否徹底同樣。
>>> a = set(['q','i','s','r','w']) >>> b = set(['a','q','i','l','o']) >>> a == b False >>> a != b True
(2)A是不是B的子集,或者反過來,B是不是A的超集,即A的元素也是B的元素,可是B的元素比A的元素數量多
判斷集合A是不是集合B的子集,可使用A<B或者A.issubset(B),返回True則是子集,不然不是.
>>> a = set("tajzhang") >>> a {'h', 'n', 'z', 'a', 'j', 'g', 't'} >>> c = set("taj") >>> c {'t', 'a', 'j'} >>> c < a True >>> c.issubset(a) True >>> a.issuperset(c) True
>>> b = set("zhang222") #當a不是b的子集
>>> b
{'h', 'n', 'z', 'a', '2', 'g'}
>>> a < b
False
>>> a.issubset(b)
Fals
(3)A、B的並集,即A、B的全部元素,以下圖:
可使用符號"|" 是一個半角狀態的豎線,也可以使用函數A.union(B) 獲得的結果就是兩個集合的並集.獲得的結果是新生成的一個對象,而不是講AB擴充
>>> a = set("tajzhang") >>> b = set("zhangquandan") >>> a {'h', 'n', 'z', 'a', 'j', 'g', 't'} >>> b {'h', 'd', 'n', 'z', 'a', 'g', 'q', 'u'} >>> c = a|b >>> c {'u', 'h', 'd', 'n', 'z', 'a', 'j', 'g', 'q', 't'} >>> d = a.union(b) >>> d {'u', 'h', 'd', 'n', 'z', 'a', 'j', 'g', 'q', 't'}
(4)A、B獲得了一個新的結果,但原有集合沒有任何改變。
>>> a {'h', 'n', 'z', 'a', 'j', 'g', 't'} >>> b {'h', 'd', 'n', 'z', 'a', 'g', 'q', 'u'} >>> c = a & b >>> c {'h', 'n', 'z', 'a', 'g'} >>> d = a.intersection(b) >>> d {'h', 'n', 'z', 'a', 'g'}
or 與 and ????
(5)A相對B的差(補),即A相對B不一樣的部分元素,以下圖所示。
>>> a = set("tajzhang") >>> b = set("zhangquandan") >>> a - b {'t', 'j'} >>> a.difference(b) {'t', 'j'} >>> b.difference(a) {'u', 'd', 'q'}
(6)A、B的對稱差集,如圖:
>>> a = set("tajzhang") >>> b = set("zhangquandan") >>> a.symmetric_difference(b) {'d', 't', 'j', 'q', 'u'} >>> b.symmetric_difference(a) {'d', 'q', 't', 'u', 'j'}