字典的擴展:
一、collections
1、count 計數器
需要先導入collections的模塊:
import collections
coun=collections.Counter('ijfiefjjfjoejwfsdjljf')
print coun
Counter({'j': 7, 'f': 5, 'e': 2, 'i': 2, 'd': 1, 'l': 1, 'o': 1, 's': 1, 'w': 1})
Counter方法會直接把傳入的參數計算出裏面各個字符串出現的次數。
>>> coun
Counter({'i': 2, 'j': 2, 'f': 2, 'l': 1})
>>> coun2
Counter({'i': 2, 'j': 2, 'f': 2, 'e': 1})
>>> coun.update(coun2) ##update可將coun2中的相同的元素次數傳入到coun中。
>>> coun
Counter({'i': 4, 'j': 4, 'f': 4, 'e': 1, 'l': 1})
>>> coun.most_common(4) ##most_common參數是幾,就顯示前幾組。
[('i', 4), ('j', 4), ('f', 4), ('e', 1)]
>>> coun.__missing__('w') ##__missing__會對查找不存在的元素返回計數器是0
0
>>> coun.elements() #elements是迭代器,在循環時候可以打印出計數器中所有的元素。
<itertools.chain object at 0x0000000002694CC0>
>>> for i in coun.elements():print i
i
i
i
i
……
給列表中的元素計算出現的次數:
>>> li=[22,52,'ww',52,'ag',22]
>>> coun=collections.Counter(li)
>>> coun
Counter({52: 2, 22: 2, 'ww': 1, 'ag': 1})
把字典的value計算次數:
>>> dic={'chen': '1234', 'liu': '9876', 'wang': '4567', 'zhang': '1234',"whiw":'4567'}
>>> dic
{'chen': '1234', 'liu': '9876', 'whiw': '4567', 'wang': '4567', 'zhang': '1234'}
>>> coun=collections.Counter(dic.values())
>>> coun
Counter({'1234': 2, '4567': 2, '9876': 1})
2、有序字典
>>> dic=collections.OrderedDict() ##定義一個有序字典。
>>> dic['k2']=2
>>> dic['k4']=4
>>> dic['k1']=1
>>> dic['k3']=3
>>> dic ##字典是按照輸入的順序來排列。
OrderedDict([('k2', 2), ('k4', 4), ('k1', 1), ('k3', 3)])
備註:OrderedDict只管第一層的順序,如果裏面再套一層字典,第二層的字典則不排序,除非第二層也用OrderedDict來定義,每次定一次,只管一層。
3、指定字典的value默認類型
字典默認的values爲None, 如果想要更改此默認值,可用collections.defaultdict
import collections
>>> dic4=collections.defaultdict(list)
>>> dic4
defaultdict(<type 'list'>, {})
dic4=collections.defaultdict(dict) ##也可設置爲默認字典和元組。
4、重命名元組 (主要用於座標的功能實現)
老的元組:
>>> old_tup=(1,4,6)
>>> old_tup
(1, 4, 6)
新元組:
>>> import collections
>>> mytuple=collections.namedtuple('mytuple',('x','y','z')) #先創建一個類
>>> new=mytuple(1,4,6) ##實例化類
>>> new
mytuple(x=1, y=4, z=6)
>>> new.x ##可以用命名來查找元素,也可通過下標來查找元素。
1
>>> new.z
6
>>> new[1]
4
>>> new[0]
1
5、雙向對列 (隊列:FIFO,先進先出)
>>> que=collections.deque()
>>> que.append(2)
>>> que.append(55)
>>> que.append(23)
>>> que.append(2)
>>> que.append('eee')
>>> que
deque([2, 55, 23, 2, 'eee'])
>>> que.pop() #默認從右邊拿走一個消息,並刪除
'eee'
>>> que
deque([2, 55, 23, 2]) ##popleft從左邊拿走一個
>>> que.popleft()
2
>>> que
deque([55, 23, 2])
>>> que.reverse() ##reverse順序反轉
>>> que
deque([2, 23, 55])
6、單向隊列 (隊列:FIFO,先進先出)
>>> import Queue
>>> dan=Queue.Queue() #創建一個隊列
>>> dan
<Queue.Queue instance at 0x000000000268B788>
>>> dan.put(3) #存消息進去
>>> dan.put(65)
>>> dan.put(9)
>>> dan
<Queue.Queue instance at 0x000000000268B788>
>>> dan.get() ##取消息出來。
3
>>> dan.get()
65
>>> dan.get()
9
>>> dan.get()
迭代器和生成器
1、迭代器
>>> import collections
>>> c=collections.Counter('244451168444')
>>> c
Counter({'4': 6, '1': 2, '2': 1, '5': 1, '6': 1, '8': 1})
>>> c.elements()
<itertools.chain object at 0x0000000001DD3BA8>
>>> d=c.elements()
>>> print d
<itertools.chain object at 0x00000000021E6C88>
此處d就是迭代器,如果想要顯示迭代器中的數據,只能用循環的方式
寫迭代器可以定義一個類,並且有迭代的方法。
2、生成器
生成器如xrange,xreadlines. 暫不在內存中實際生成數據,只有在循環的時候纔會生成。
下標循環:
>>> li=['liu','cheng','wang',42,82]
>>> for a in range(len(li)):
... print li[a]
liu
cheng
wang
42
82
用冒泡算法給列表排序:
li = [89,22,63,11,43]
for i in range(len(li)):
for i in range(len(li)-1):
if li[i] < li[i+1]:
li[i],li[i+1]=li[i+1],li[i]
print li
函數:
內置函數
模塊類:
vars() : 打印當前模塊的所有變量。(文件所在路徑;__name__的值;__doc__的值,所有註釋;)
help(): 打印幫助信息
dir(): 打印某個模塊中所有的方法
type(): 打印對象的類型
reload(): 重新import 模塊。
id(): 某個變量或對象所在的內存地址。
----------------------------------------------------------------
計算類函數:
cmp(): 比較兩個值大小
abs() : 返回絕對值
bool():判斷對象的bool值是True還是False
divmod(10,4): 返回兩個值,第一個爲商,第二個爲餘數。
max(): 取最大值
min(): 取最小值
sum(): 取和
pow(5,4) : 取5的4次方。
--------------------------------------------------------
對順序的處理函數:
len(): 求對象的長度
all(): 如果傳入的參數值都不爲空或False,則返回True, 如果其中有一個元素爲空或False,則返回 False
any(): 判斷如果有一個爲真,就返回真。
-------------------------------------------------------------
各種轉換(進制或者ASCII):
ord('B'):將字符轉換爲ASCII碼。
chr(88): ord()函數的逆運算,將ASCII碼轉換爲對應的字符。
hex(15): 將十進制的數字轉換爲16進制
oct(): 將十進制的數字轉換爲8進制。
bin(): 將十進制的數字轉換爲二進制。
enumerate(): 打印出一個順列的下標和所對應的內容。
lis=['Bao','Watch','Aodi','Fang']
for item in enumerate(lis,1):
print item[0],item[1]
##enumerate()函數是給列表中每個元素前加上序號,第二個參數爲起始值。(序列號)
--------------------------------------------------------------------------------------------
apply():
map():
filter()函數爲過濾生成新列表,當在第一個功能函數內返回True時候,才把元素放到新列表中,否則過濾掉
li=[15,22,66,43]
def test(num):
if num>40:
return True
else:
return False
print filter(test,li)
reduce()函數可以將累列中的數據進行 累加,累乘:
li=[11,22,66]
print reduce(lambda x,y:x+y,li)
99
print reduce(lambda x,y:x*y,li)
li=[7,2,6]
print reduce(lambda x,y:x*y,li)
84
##從1加到100:
def recursion(x,y):
return x+y
print reduce(recursion,range(1,101))
zip()函數:
li= [7,2,6]
li1=[3,1,5]
li2=[53,42,8]
print zip(li,li1,li2)
執行結果:
[(7, 3, 53), (2, 1, 42), (6, 5, 8)]
##把多個列表的中的相同的列組成新的列表。
函數定義方法:
1、def定義函數關鍵字
2、通過函數名來調用函數
3、函數聲明,不自動執行,調用時才執行
4、函數的參數和返回值
返回值分兩種:
1、未明確定義返回值,則返回None
2、返回值可以賦值給某個變量。
參數:普通參數,默認參數,動態參數。
動態參數:
1、形參 前面加一個*號
2、可傳遞序列即多個參數,傳進去後會變成一個元組的第一個元素,如果在傳遞序列參數時,前面也加一個*號,則會把傳弟進的序列當成一個元組。
Example1:
def param(*arg):
print arg
li=[35,'chen',99]
param(*li)
3、加兩個*的形參,在傳遞參數時需要是一個字典的形式,並且傳參數時前面也要加兩個*號。
Example2:
def param(**arg):
print arg
dic={'chen':35,'wang':99}
param(**dic)
4、將一個*的形參和兩個*的形參同時使用,傳遞參數時有兩種情況:
Example3:
def param(*arg1,**arg2):
print arg1
print arg2
第一種傳參:
param('fje',24,'wang',ke=345,k4=284)
第二種傳參:
li=['liz','wang',42]
dic={'chen':35,'wang':99}
param(*li,**dic)
文件的操作
文件的打開與寫入:
f=open('D:\TDDOWNLOAD\examp.txt','r+') ##r+是追加,會把寫入時候的當前所在位置字符替換掉。
dic="{'chen': 35, 'wang': 99}"
print f.tell() ##tell可以打印出當前的所在位置
f.seek(0) ##seek可以跳轉到文件指定位置
f.write(dic)
print f.tell()
f.close()
如果在打開 文件時用a+,那麼不管指針調到哪裏,在寫入時始終會從後面追加寫入。在用'r'方式打開文件時,可以在後面加上'U', 即"rU"可以讓不同平臺的換行符(有的是"\r\n", 有的是'\r')都統一爲\n
f.truncate() ##truncate函數會從當前指針的位置截斷文件。
flush() ##flush可以將緩存中的數據刷新到系統緩存上,要等系統緩存再刷到硬盤上。
print f.next() ##next函數可以一次讀取一行。如果沒有下一行,會報以下錯誤:
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration
f.readlines() ##readlines一次性讀取文件所有的行,並按行分隔爲一個列表
f.readline() ##readline一次讀取一行。
上下文管理工具:with
with open('D:\TDDOWNLOAD\examp.txt','r+') as f:
for line in f:
print line
用with來管理打開的文件,不用關閉即可,它自動會關閉文件。
with open('D:\TDDOWNLOAD\examp.txt','r+') as f, open('D:\TDDOWNLOAD\examp2.txt','w') as f2:
for line in f:
f2.writelines(line)
with可以快速的同時打開兩個文件,然後將文件1中的數據循環讀取寫入文件2中。