標籤:python
產生列表可以用range();
列表解析
對一個序列進行解析產生新的列表;列表解析比for的效能好很多;
a=[x for x in range(0,10) if x > 5]print aa=[x+1 for x in range(0,10) if x > 5]print a
利用列表中的運算式可以得出所需的列表,無需在用for迴圈得到;
雙重嵌套:用更簡便的語句得出裡列表:
a=[(x,y) for x in range(3) for y in range(3)]print a
解析器中提供了很多的內建函數:
filter(function,iter)
fuction是一個函數,只接受一個參數,就是傳進來的iter的這個序列,返回一個過濾後的序列;
返回的值是iter中的值,滿足的返回,fuction為真的返回;
map(function,iter)
function是一個函數,依次接受iter列表中的所有元素,對應傳回值產生一個列表;
def f(x): return x%5==0def u(x): return x+1a = filter(f,range(0,100))print aa = map(u,range(0,10))print a
列表解析的缺點就是記憶體效率太低;因此提出了:
產生器運算式
每次只把一個元素載入再返回,與列表解析唯一的文法不同就是用的元括弧,返回的是一個列表頭指標
,得到指標後,需要用for迴圈得出;
a = (x for x in range(0,10) if x%3==0)print afor i in a: print i
condition為非0時,即為要返回的元素,為0時,則為false
xrange
range的產生器版本,在大範圍的需求下,用這個;和range的用法一樣
for i in xrange(0,9999999): if i%999==0: print i
字典和集合
字典
字典是無序的索引值對,基於雜湊表實現,key可以被hash;通過雜湊函數算出雜湊值,而後取值;
可以做建的類型(內容不可變):
一般建議用字串;類執行個體做key,需實現hash方法返回雜湊值,列表和字典不可以做key,因為列表和字典可變;元組可做key,內不可含有列表。。;
可以通過內建的hash()函數,來判斷是否可以做為索引值;
建立字典:{key:value},也可以用dict()工廠函數來建立
a={‘a‘:1,‘b‘:2}print aa=dict(a=‘c‘,b=2)print aprint a.get(‘c‘,‘not exist‘)
dict()函數建立使,key預設是字串,value預設也是,數字可以直接寫;
在不確認字典中是否有鍵時,可以用字典的get方法去取,不會報錯,返回default值,這是一個很安全的操作;
del dict[key]可刪除,dict[‘無‘]=3,若這個鍵沒有,則建立;
尋找鍵:
keys函數返回字典中存在的鍵,返回的是一個列表
a={‘a‘:1,‘b‘:2,‘c‘:3}b = a.keys()print b
集合(set)
a = set([1,2,3])b = list([1,2,3,4])b.append(5)a.add(5)
set集合裡面的值是唯一的,添加元素用add方法,update可以同時更新一組序列;
集合可進行聯合,交集,差集和異或操作。
題目:
設計一個函數zip(lista,listb,repl),輸入兩個列表和預留位置,返回一個新的列表,列表裡面的每一個元素是一個元組,元組的元素是對應同樣順序的在lista和listb中的元素,如果長度不相同,則用預留位置來代替。
def zip(lista,listb,repl): lena = len(lista) lenb = len(listb) length = 0 list = [] if lena < lenb: length = lena else: length = lenb for i in range(0,length): list.append((lista[i],listb[i])) if lena > length: for i in range(length,lena): list.append((lista[i],repl)) if lenb > length: for i in range(length,lenb): list.append((repl,listb[i])) print listzip([1,2,3],[4,5,6],"a")zip([1,2,3],[4],"b")
學習日誌---python(列表解析、產生器、字典和集合)