list & dict & strpython
這三種類型是python中最經常使用的幾種數據類型。他們都是序列的一種api
■ 序列通用操做數據結構
1. 分片app
s[a:b] 返回序列s中從s[a]到s[b-1]的片斷。注意s[0:0]是空集而不是s[0]函數
s[a:b:c] 加入第三個參數以設置取樣步長。能夠設置成負數來從右向左取樣編碼
2. 加減乘除spa
[None] *2 => [None,None] code
* 注意,這種列表直接乘以數字的作法是淺拷貝一個自身,而後再extend進去。因爲是淺拷貝,因此存在着可變對象這樣初始化可能會出現問題。好比:orm
a = [{}] * 3 這樣初始化變量a後。表面上看a是一個由三個字典組成的列表,可是實際上,a[0]['key'] = 'value'以後,a的值會變成[{'key': 'value'},{'key': 'value'},{'key': 'value'}],即三個字典實際上指向的是同一個對象,致使變化始終同步。對象
3. 一些內建函數的操做
len(s),max(s),min(s)等
■ list
對於list類型,從數據結構層面上的分析記錄在了「線性表的順序表」中,在這不作展開。這裏主要說明一下經常使用的list方法
對於列表ls
賦值 只要不越界,就能夠進行分片的賦值
del del語句後面加的是list[index],不是值也不是索引
ls.append() 返回值是None
ls.count(...) 計某一值出現的次數
ls.extend(another_ls) 將兩個列表合併
ls.index(value) 獲取某個值的索引
ls.insert(index,value) 在某個地方插入值
ls.pop() 不加參數默認pop掉最後一個元素而且返回其值
ls.remove(..) 去除從左到右第一個匹配到的值,若是沒找到報錯
ls.reverse() 返回None,對ls自己反序
ls.sort() 返回None,對ls自己排序
//以上兩個和sorted(ls),reversed(ls)區別,這兩個是以ls爲素材返回一個排序或者反序的迭代器。
//順便,sorted和sort能夠再傳一個key做爲參數,key是一個函數對象,意思是在進行排序時依據不是默認的東西,而是把各個遍歷的項(對字典來講就是鍵)做爲參數傳給key函數後通過處理後的返回值。好比想讓一個字典的列表按照每一個字典中的某個鍵"dict_key"的值大小來排序就能夠sorted(dict,key=lambda x:x.get("dict_key"))
■ dict
dict類型保存鍵值對,其鍵只能是str,tuple等不可變類型或者自定義的類型。假如是tuple之類組合對象的話tuple中的每個元素都還必須是不可變類型。字典類型能夠容納任意多的鍵值對,而且支持高效檢索(從字典中存取數據所花平均時間是O(1)的,但最壞狀況下有可能達到O(n)。)
對於字典d有如下方法
d.clear() 清空字典
d.copy() 深複製
d.get(...)
d.has_key(...) 判斷字典是否含有某個鍵
d.items() 字典列表化,每一個元素是個元組,tuple[0]是key,tuple[1]是value
d.keys()
d.update(e) 用e更新d,對於d中沒有的key則新建item,對於有的覆蓋老的value
d.values()
■ str
對於字符串s
s.find(...) 返回子串的位置
'mark'.join(list) 將mark做爲分隔符把一個list給合併成一個字符串
s.lower() 所有小寫化
s.upper() 所有大寫
s.title() 單詞詞首所有大寫
s.capitalize() 字串串首大寫
s.isupper() 判斷是不是所有字符都是大寫
s.islower()
s.istitle()
//以上這六七個對字符串的文字性的處理都是返回值,不改變字符串自己的
s.replace(a,b)
s.split()
s.strip()
s.format("a","b") 這是個比較重要且有用的方法。用"a","b"等給出的素材串替換s中的帶大括號的部分,至關於%s % (...)的做用。s中能夠寫"{},{}",這樣format函數的參數會依次填補這些大括號,若是想要手動指定順序也能夠"{1},{0}"。若是s中寫的不是{0},{1}這種的話能夠寫{some_text},而後在format的參數裏就要寫some_text=...來指定替換的變量的名稱(有點模板語言的意思).相比於%的格式化字符串的替換,這個能夠不用寫徹底一對一的個數。format的變量寫法的話全部一樣的變量都只要寫一次就行了。*今天用這個format遇到一個坑:當你要替換的字符串裏有正則指定模式重複多少遍的表達式(好比{12})這樣的話format會報錯,由於它把正則的{12}當成它要解析的第十二個變量了。解決方法是寫兩遍大括號來轉義,即原文中的{12}若是要進行format就要寫成{{12}}。
在要通過format處理的字符串中還能夠有更加靈活的寫法。上面說究竟是用format參數指定的值來替換一些字符串中的變量,但實際上,format的參數甚至能夠是一個對象,而後在格式化字符串裏面寫上同名變量進行邏輯運算後再替換,好比能夠經過下標或者訪問屬性的方法來取值:
#能夠直接傳一個列表對象 "{li[0]} and {li[1]} are two items".format(li=[1,2]) #在類中能夠有相似如下的書寫方法,至關於傳一個自定義對象來取值格式化 "my name is {self.name} and my age is {self.age}".format(self=self)
關於格式化輸出這方面,用%號格式化輸出的規則和C語言相似,可是用format方法的話不太同樣,其表現形式是在大括號中加上冒號,以及各類不一樣的符號來表達格式化。好比<,^,>分別表示左對齊居中和右對齊,前面加上一個字符以表示填充符,後面加上一個數字表示寬度。"{var:0>8}".format(var="123") 獲得"00000123"。"{:.2f}"則表示輸出的數字要是float類型且保留兩位小數,除了f表示float以外還能夠有{:b}表示二進制,{:x}表示十六進制等,它們會自動對你傳遞進去的數字作進制轉換再轉化成字符串輸出。類型提示必須放在位置提示後面好比"{var:0^20.2f}"這樣。另外冒號後面加上一個逗號可讓輸出有千位分隔。好比"{:,}".format(123456789)獲得"123,456,789"
另外,使用format的時候應該注意,調用它的對象和方法中的參數應儘可能作到類型一直,好比"".format("")或者u"".format(u"")。若是出現str.format(unicode)時python默認操做是用系統的默認編碼格式(sys.getdefaultcoding那個)對unicode進行encode而後將其整合到相應str中去。相似的,若是是unicode.format(str)的話,那麼就是拿系統默認編碼對str進行decode以後再整合進unicode。
■ string模塊
其實str類自己的一些方法還不夠強大,因此有了專門的String模塊來處理一些事情
string模塊的成員變量們:
string.lowercase 指代全部小寫字母,至關於"abcd....xyz"
string.uppercase
string.letters 全部字母,先大寫再小寫,至關於"abcd...xyzABC..XYZ"
string.whitespace 全部空白字符
string.punctuation 一些標點符號
string模塊的方法:
capitlize(s) 返回S的首字母大寫的串
capwords(s,sep) 用sep來split掉s,而後把split出來的每部分的首字母大寫,再用sep把這些部分鏈接起來,sep默認爲空格
center(s,width[,fllchar]) 把s放在width(一個int數)長的字符串鄭重,兩邊用fillchar填充。能夠用於生成文本文件中的分隔符之類的
count(s,sub[,start[,end]]) 返回在s[start:end]片斷中sub子串出現的次數
swapcase(s) 切換大小寫字母
zfill(s,width) 在s左側添加0知道寬度達到width
上面曾經提到過s.format相似模板語言(好比velocity,python的jinja2模塊等)的功能,其實這是基於string中的一些類。string中有個Template類可讓用戶手動地構造簡單的模板:
from string import Template s = Template("Hello, ${name}") #變量用${...}的形式 s.substitute(name="Frank") #返回Hello, Frank s.safe_substitute(namae="Frank") #save_substitute()對找不到的變量不報錯