list & dict & str
這三種類型是python中最常用的幾種數據類型。他們都是序列的一種
■ 序列通用操作
1. 分片
? s[a:b] 返回序列s中從s[a]到s[b-1]的片段。注意s[0:0]是空集而不是s[0]
? s[a:b:c] 加入第三個參數以設置取樣步長。可以設置成負數來從右向左取樣
2. 加減乘除
? [None] *2 => [None,None]
*? 注意,這種列表直接乘以數字的做法是淺拷貝一個自身,然后再extend進去。由于是淺拷貝,所以存在著可變對象這樣初始化可能會出現問題。比如:
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 Templates = Template("Hello, ${name}") #變量用${...}的形式 s.substitute(name="Frank") #返回Hello, Frank s.safe_substitute(namae="Frank") #save_substitute()對找不到的變量不報錯
?