1-1 如何在列表, 字典, 集合中根據(jù)條件篩選數(shù)據(jù)
實(shí)際案例
1)過濾掉列表[3,9,-1,10,20,-2…]中的負(fù)數(shù)
2)篩出字典{'Lilei':79,'jim':88,'Lucy':92}中值高于90的項(xiàng)
3)篩出集合{77,89,32,20}中能被3整除的元素
通常的做法是用迭代糖权,舉例如下:
data=[1,5,-3,-2,6,0,9,100,67]
res=[]
for x in data:
if x>=0:
res.append(x)
print res
新的思路:
第一種方式诀姚,利用filter函數(shù)
filter
from random import randint
data2=[randint(-10,10) for _ in xrange(10)]
print data2
f=filter(lambda x:x>=0,data2)
print f
第二種方式斥铺,用列表解析
b=[x for x in data2 if x>=0]
print b
以上兩種方式挽放,列表解析更快一些丑瞧。
下面可以這樣測試
timeit filter(lambda x:x>=0,data2)
print c
2)EX:某班有20個(gè)人擎颖,得到一個(gè)字典
from random import randint
d={x:randint(60,100) for x in xrange(1,21)}
print d
采用字典解析
dd={k:v for k,v in d.iteritems() if v>90}
print dd
1-2 如何為元組中的每個(gè)元素命名, 提高程序可讀性
如何為元組中的每個(gè)元素命名,提高程序可讀性蔓钟?
方案1:定義類似與其他語言的枚舉類型永票,也就是定義一系列數(shù)值常量。
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3
student = ('Jim',16,'male','jim8721@qq.com')
#name
print student[NAME]
#AGE
if student[AGE] >= 18:
print True
else:
print False
#...
#SEX
if student[SEX] == 'male':
#...
pass
上面是是第一種方案滥沫,接下來看第二種方案
方案2:使用標(biāo)準(zhǔn)庫中collections.namedtuple替代內(nèi)置tuple
from collections import namedtuple
NAME,AGE,SEX,EMAIL = xrange(4)
Student = namedtuple('Student',['name','age','sex','email'])
s=Student('Jim',16,'male','jim8721@qq.com')
print s
s2 = Student('Jim',16,'male','jim8721@qq.com')
print s.name
print s.age
print s.sex
print isinstance(s,tuple)
補(bǔ)充
Python中存儲(chǔ)系列數(shù)據(jù)侣集,比較常見的數(shù)據(jù)類型有l(wèi)ist,除此之外兰绣,還有tuple數(shù)據(jù)類型世分。相比與list,tuple中的元素不可修改缀辩,在映射中可以當(dāng)鍵使用臭埋。tuple元組的item只能通過index訪問,collections模塊的namedtuple子類不僅可以使用item的index訪問item臀玄,還可以通過item的name進(jìn)行訪問瓢阴。可以將namedtuple理解為c中的struct結(jié)構(gòu)健无,其首先將各個(gè)item命名荣恐,然后對(duì)每個(gè)item賦予數(shù)據(jù)。
1-3如何統(tǒng)計(jì)序列中元素的出現(xiàn)頻度累贤?
實(shí)際案例
1.某隨機(jī)序列[12,5,6,4,6,5,5,7,…]中募胃,找到出現(xiàn)次數(shù)最高的3個(gè)元素,它們出現(xiàn)次數(shù)是多少畦浓?
2.對(duì)某英文文章的單詞,進(jìn)行詞頻統(tǒng)計(jì)检疫,找到出現(xiàn)次數(shù)最高的10個(gè)單詞讶请,它們出現(xiàn)次數(shù)是多少?
解決辦法
1.首先我們創(chuàng)建這個(gè)隨機(jī)序列,導(dǎo)入random模塊下的randint
from random import randint
利用列表解析randint產(chǎn)生一個(gè)隨機(jī)序列夺溢,值在0-20之間论巍,產(chǎn)生30個(gè)元素,然后將值賦給變量data
from random import randint
data=[randint(0,20) for _ in xrange(30)]
print data
輸出:
[2, 15, 15, 17, 11, 13, 16, 20, 7, 13, 18, 3, 9, 6, 12, 4, 3, 20, 5, 7, 14, 3, 13, 6, 2, 17, 6, 15, 20, 7]
這樣序列就有了风响。
思考:
最終的結(jié)果肯定是一個(gè)字典嘉汰。
以data作為字典的鍵,以0作為初始值状勤,創(chuàng)建一個(gè)新字典c
c=dict.fromkeys(data,0)
print c
{1: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 13: 0, 16: 0, 19: 0, 20: 0}
得到這樣的字典后鞋怀,我們可以對(duì)data進(jìn)行迭代。
每碰到一個(gè)x持搜,就到c中相應(yīng)的位置加1密似,也就是在它值上加1就可以了。
這個(gè)循環(huán)運(yùn)行完后葫盼,就是我們c中統(tǒng)計(jì)的結(jié)果
for x in data:
c[x] += 1
{0: 1, 1: 1, 2: 3, 3: 1, 5: 2, 6: 3, 8: 1, 9: 3, 10: 3, 11: 1, 12: 4, 13: 1, 14: 2, 15: 1, 16: 2, 18: 1}
上面這是一種方法残腌,但是要找到頻度最高的3個(gè)元素,也就是根據(jù)字典的值贫导,對(duì)字典進(jìn)行排序抛猫。
另一種方法:
使用collections.Counter對(duì)象:
將序列傳入Counter的構(gòu)造器,得到Counter對(duì)象是元素頻度的字典孩灯。
Counter.most_common(n)方法得到頻度最高的n個(gè)元素的列表闺金。
具體操作
首先從collections下導(dǎo)入Counter,這個(gè)Counter專門用來處理這類問題钱反。
from collections import Counter
c2 = Counter(data)直接將data傳給Counter的構(gòu)造器
掖看,讓這個(gè)變量為c2,它也是一個(gè)字典面哥,與c一樣哎壳。
from collections import Counter
c2 = Counter(data)
接下來,使用Counter.most_common(n)尚卫,也就是common方法
找到頻度最高的3個(gè)元素
將3傳進(jìn)去
c2.most_common(3)
#輸出:
Counter({3: 5, 17: 4, 12: 3, 14: 3, 15: 3, 0: 2, 5: 2, 1: 1, 4: 1, 6: 1, 8: 1, 10: 1, 13: 1, 16: 1, 20: 1})
0
1
[(3, 5), (17, 4), (12, 3)]
2.我們先找一個(gè)文本文件归榕,mytest.txt
對(duì)其進(jìn)行詞頻統(tǒng)計(jì)
先導(dǎo)入正則表達(dá)式的re模塊,打開它并讀進(jìn)來,整個(gè)作為一個(gè)字符串吱涉。
import re
txt=open('mytest.txt').read()
然后進(jìn)行分割刹泄,將每個(gè)詞取出來,放在一個(gè)序列當(dāng)中
我們使用正則表達(dá)式的分割方法
re.split('\W+',txt)
這個(gè)列表得到之后怎爵,我們可以傳給Counter并賦給c3這個(gè)變量
import re
txt = open('mytest.txt').read()
c3 = Counter(re.split('\W+',txt))
【知識(shí)補(bǔ)充】
collections模塊的Counter類
Counter類的目的是用來跟蹤值出現(xiàn)的次數(shù)特石。它是一個(gè)無序的容器類型,以字典的鍵值對(duì)形式存儲(chǔ)鳖链,其中元素作為key姆蘸,其計(jì)數(shù)作為value。計(jì)數(shù)值可以是任意的Interger(包括0和負(fù)數(shù))。Counter類和其他語言的bags或multisets很相似逞敷。
1-4如何根據(jù)字典中值的大小狂秦,對(duì)字典中的項(xiàng)排序
【實(shí)際案例】
某班英語成績以字典形式存儲(chǔ)為:
{'LiLei':79,'Jim':88,'Lucy':92…}
根據(jù)成績高低,計(jì)算學(xué)生排名推捐。
【解決方案】
使用Python的內(nèi)置函數(shù)sorted
1.利用zip將字典數(shù)據(jù)轉(zhuǎn)化元組
2.傳遞sorted函數(shù)的key參數(shù)
In [10]: sorted([9,1,2,8,5,4])
Out[10]: [1, 2, 4, 5, 8, 9]
首先我們采用隨機(jī)函數(shù)創(chuàng)建隨機(jī)的成績表裂问,
我們用xyzabc代表6個(gè)人
將生成的成績表,然后將它賦給變量d
from random import randint
d={x: randint(60,100) for x in 'xyzabc'}
print d
結(jié)果:
{'a': 65, 'c': 73, 'b': 96, 'y': 91, 'x': 83, 'z': 84}
我們首先看直接排序
dd=sorted(d)
print dd
結(jié)果:
['a', 'b', 'c', 'x', 'y', 'z']
======
In [17]: d={x: randint(60,100) for x in 'xyzabc'}
In [18]: iter(d)
Out[18]: <dictionary-keyiterator at 0x3f787c8>
In [19]: list(iter(d))
Out[19]: ['a', 'c', 'b', 'y', 'x', 'z']
In [20]:
這是我們不需要的結(jié)果牛柒,所以此時(shí)要將字典進(jìn)行某種轉(zhuǎn)換堪簿,讓它變成sorted可以排序的結(jié)構(gòu)
字典的項(xiàng)無非就是一個(gè)鍵和一個(gè)值
我們想到了元組
假設(shè)我們將其轉(zhuǎn)換成這種形式,將值放在前面
(97,'a')(69,'b')
思考:
我們?yōu)槭裁匆獙⒅捣旁谇懊妫?/p>
因?yàn)樵M的比較焰络,是先比較第0個(gè)元素
In [20]: (97,'a')> (69,'b')
Out[20]: True
In [22]: (97,'a')> (97,'b')
Out[22]: False
這樣我們思路有了:
就是將字典變成上面這樣的元組的一個(gè)列表戴甩,(97,'b'),每一個(gè)都變成這樣一個(gè)元組
先看一下:得到鍵和值的方法:
In [23]: d.keys()
Out[23]: ['a', 'c', 'b', 'y', 'x', 'z']
In [24]: d.values()
Out[24]: [92, 94, 61, 60, 80, 72]
這樣闪彼,我們用ZIP函數(shù)給拼起來甜孤,做成一個(gè):
In [25]: zip(d.values(),d.keys())
Out[25]: [(92, 'a'), (94, 'c'), (61, 'b'), (60, 'y'), (80, 'x'), (72, 'z')]
這樣就構(gòu)成了一個(gè)元組的列表
可以進(jìn)行內(nèi)存優(yōu)化一下:
In [26]: zip(d.itervalues(),d.iterkeys())
Out[26]: [(92, 'a'), (94, 'c'), (61, 'b'), (60, 'y'), (80, 'x'), (72, 'z')]
然后對(duì)zip(d.itervalues(),d.iterkeys())進(jìn)行sorted()
In [27]: sorted(zip(d.itervalues(),d.iterkeys()))
Out[27]: [(60, 'y'), (61, 'b'), (72, 'z'), (80, 'x'), (92, 'a'), (94, 'c')]
上面是第一種方式
下面我們看第二種方式
同樣需要這樣一個(gè)元組的列表進(jìn)行排序
In [28]: d.items()
Out[28]: [('a', 92), ('c', 94), ('b', 61), ('y', 60), ('x', 80), ('z', 72)]
這里邊我們就可以使用sorted的一個(gè)參數(shù)key
傳遞一個(gè)lambda匿名函數(shù),我們可以定義哪個(gè)作為比較的鍵
In [29]: sorted(d.items(),key=lambda x:x[1])
Out[29]: [('y', 60), ('b', 61), ('z', 72), ('x', 80), ('a', 92), ('c', 94)]
【知識(shí)補(bǔ)充】
一畏腕、lambda函數(shù)也叫匿名函數(shù)缴川,即,函數(shù)沒有具體的名稱描馅。先來看一個(gè)最簡單例子:
def f(x):
return x**2
print f(4)
# Python中使用lambda的話把夸,寫成這樣
g = lambda x : x**2
print g(4)
二、lambda和普通的函數(shù)相比铭污,就是省去了函數(shù)名稱而已恋日,同時(shí)這樣的匿名函數(shù),又不能共享在別的地方調(diào)用嘹狞。
其實(shí)說的沒錯(cuò)岂膳,lambda在Python這種動(dòng)態(tài)的語言中確實(shí)沒有起到什么驚天動(dòng)地的作用,因?yàn)橛泻芏鄤e的方法能夠代替lambda磅网。
- 使用Python寫一些執(zhí)行腳本時(shí)谈截,使用lambda可以省去定義函數(shù)的過程,讓代碼更加精簡涧偷。
- 對(duì)于一些抽象的簸喂,不會(huì)別的地方再復(fù)用的函數(shù),有時(shí)候給函數(shù)起個(gè)名字也是個(gè)難題燎潮,使用lambda不需要考慮命名的問題瞻鹏。
- 使用lambda在某些時(shí)候讓代碼更容易理解节仿。
lambda基礎(chǔ)
lambda語句中嗓奢,冒號(hào)前是參數(shù),可以有多個(gè)唉锌,用逗號(hào)隔開,冒號(hào)右邊的返回值竿奏。lambda語句構(gòu)建的其實(shí)是一個(gè)函數(shù)對(duì)象,見證一下:
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print filter(lambda x: x % 3 == 0, foo)
print map(lambda x: x * 2 + 10, foo)
print reduce(lambda x, y: x + y, foo)
1-5 如何快速找到多個(gè)字典中的公共鍵
什么是公共鍵腥放?
就是在每個(gè)字典中都出現(xiàn)的鍵泛啸。
【實(shí)際案例】
西班牙足球隊(duì)甲級(jí)聯(lián)賽,每一輪球員進(jìn)球統(tǒng)計(jì):
第一輪:{'蘇亞雷斯':1,'梅西':2,'本澤馬':1,'C羅':3…}
第二輪:{'蘇亞雷斯':2,'C羅':1,'格里茲曼':2,'貝爾':2…}
第三輪:{'蘇亞雷斯':1,'托雷斯':2,'貝爾':2,'內(nèi)馬爾':1…}
……
統(tǒng)計(jì)出前N輪秃症,每場比賽都有進(jìn)球的球員候址。
【解決辦法】
方法一:使用簡單的遍歷
我們先用隨機(jī)函數(shù)
先隨機(jī)產(chǎn)生進(jìn)球球員
假設(shè)有7名球員:abcdefg,然后用sample函數(shù)進(jìn)行隨機(jī)取樣种柑,產(chǎn)生進(jìn)球的球員
比如產(chǎn)生3個(gè)
>>> sample('abcdefg',3)
['a', 'b', 'd']
數(shù)字不是固定的岗仑,不是每輪都是3個(gè)人進(jìn)球,這樣我們?cè)俑囊幌戮矍耄屵M(jìn)球的球員數(shù)目也是隨機(jī)的
3-6個(gè)人進(jìn)球
>>> sample('abcdefg',randint(3,6))
['a', 'c', 'f']
>>> sample('abcdefg',randint(3,6))
['e', 'a', 'f', 'b', 'c']
>>>
之后荠雕,我們就可以用字典解析產(chǎn)生每輪的數(shù)據(jù)
我們可以這樣做:
我們限定每一輪的進(jìn)球數(shù)為1-4個(gè),
第一輪:
>>> s1={x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
>>> s1
{'a': 3, 'd': 3, 'g': 4}
這樣s1的數(shù)據(jù)就產(chǎn)生了驶赏。
我們用相同的方法產(chǎn)生第二輪炸卑,第三輪的數(shù)據(jù)
>>> s2={x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
>>> s3={x: randint(1,4) for x in sample('abcdefg',randint(3,6))}
>>>
然后我們分別看一下:
>>> s1
{'a': 3, 'd': 3, 'g': 4}
>>> s2
{'c': 3, 'b': 3, 'e': 2, 'd': 1, 'g': 3, 'f': 3}
>>> s3
{'a': 3, 'b': 4, 'e': 4, 'd': 1, 'f': 1}
>>>
我們看到d球員每輪都有進(jìn)球
解決的辦法是我們迭代其中的鍵
先定義一個(gè)res:
>>> res = []
>>> for k in s1:
if k in s2 and k in s3:
res.append(k)
>>> res
['d']
>>>
從而找到了公共鍵
方法二:利用集合(set)的交集操作:
step1:使用字典的viewkeys()方法,得到一個(gè)字典keys的集合
(這是python2的做法煤傍,python3使用keys()方法獲得所有的鍵)
step2:使用map函數(shù)盖文,得到所有的字典的keys的集合
step3:使用reduce函數(shù),取得所有字典的keys的集合的交集
如下操作:
>>> s1.viewkeys()
dict_keys(['a', 'd', 'g'])
>>>
這樣我們就得到了這樣一個(gè)集合
接下來我們同樣對(duì)s2和s3同樣取這樣的集合
>>> s2.viewkeys()
dict_keys(['c', 'b', 'e', 'd', 'g', 'f'])
>>> s3.viewkeys()
dict_keys(['a', 'b', 'e', 'd', 'f'])
>>>
既然是集合蚯姆,我們就可以取它的交集
>>> s1.viewkeys() & s2.viewkeys() & s3.viewkeys()
set(['d'])
>>>
這是我們以集合的方式解決了這個(gè)問題
上面是3輪的做法五续,如果是n輪怎么辦?
我們可以用map函數(shù)和reduce函數(shù)處理這樣的問題
>>> map(dict.viewkeys,[s1,s2,s3])#對(duì)于n輪向下添加
[dict_keys(['a', 'd', 'g']), dict_keys(['c', 'b', 'e', 'd', 'g', 'f']), dict_keys(['a', 'b', 'e', 'd', 'f'])]
具體思路1和2進(jìn)行交集龄恋,其結(jié)果再與第3個(gè)交集……
總用前面一系列的結(jié)果和后面一個(gè)進(jìn)行交集疙驾,進(jìn)行迭代:
>>> reduce(lambda a,b: a & b,map(dict.viewkeys,[s1,s2,s3]))
set(['d'])
>>>
用一條命令得到這樣的結(jié)果
1-6如何讓字典保持有序?
【實(shí)際案例】
編程競賽系統(tǒng)篙挽,對(duì)參賽選手編程解題進(jìn)行計(jì)時(shí)荆萤,選手完成題目后,把該選手解題用時(shí)記錄到字典中铣卡,以便賽后按選手名查詢成績链韭。
(答題時(shí)間越短,成績?cè)絻?yōu))
{'Noodles':(2,43).'Rossum':(5,43),'Tom':(1,23)......}
比賽結(jié)束后煮落,需按排名順序依次打印選手成績敞峭,如何實(shí)現(xiàn)?
【分析問題】
分析:
越先進(jìn)入字典的,他成績?cè)絻?yōu)秀蝉仇,所以我們希望能像列表那樣旋讹,能按照每一個(gè)項(xiàng)進(jìn)入字典的次序來打印它殖蚕,但是python中默認(rèn)的字典是不具備這樣的功能的,也就是不具備這樣的有序性
首先我們創(chuàng)建一個(gè)字典
d = {}
# 假設(shè)Jim是第一個(gè)完成比賽的人沉迹,35分鐘
d['Jim'] = (1,35)
# 第二個(gè)睦疫,37分鐘
d['Leo'] = (2,37)
# 第三個(gè),40分鐘
d['Bob'] = (3,40)
我們希望要的是我們?cè)诘@個(gè)字典d的時(shí)候鞭呕,它能按照先后進(jìn)入順序進(jìn)行遍歷
In [5]: for k in d: print k
Bob
Jim
Leo
In [6]:
明顯次序不對(duì)蛤育,所以我們不能使用這樣的數(shù)據(jù)結(jié)構(gòu)
我們使用一個(gè)能維護(hù)這樣結(jié)果的數(shù)據(jù)字典
【解決方案】
我們使用collections.OrderedDict,它是一個(gè)有序的字典
以O(shè)rderedDict替代內(nèi)置字典Dict葫松,依次將選手成績存OrderedDict
我們先創(chuàng)建這樣一個(gè)字典瓦糕,它也叫d
d = OrderedDict()
然后將上面的3個(gè)復(fù)制一下
之后,我們同樣迭代
程序段如下:
In [7]: from collections import OrderedDict
In [8]: d = OrderedDict()
In [9]: d['Jim'] = (1,35)
In [10]: d['Leo'] = (2,37)
In [11]: d['Bob'] = (3,40)
In [12]: for k in d: print k
Jim
Leo
Bob
In [13]:
這樣次序就對(duì)了腋么。
我們這樣模擬
我們創(chuàng)建出8名拳手
players = list('ABCDEFGH')
這里需要time模塊的time函數(shù)咕娄,開始時(shí)記一下時(shí)間,結(jié)束時(shí)記一下時(shí)間珊擂。
In [13]: players = list('ABCDEFGH')
In [14]: from time import time
定義一個(gè)start用來記錄考試開始的時(shí)間點(diǎn)
start = time()
接著等待每個(gè)人答題完畢
下面進(jìn)行模擬:
from time import time
from random import randint
from collections import OrderedDict
d = OrderedDict() #創(chuàng)建這樣一個(gè)成績表
players = list('ABCDEFGH')
start = time()
for i in xrange(8):
input()
p = players.pop(randint(0,7-i))
end = time()
print (i+1,p,end - start)
d[p] = (i+1,end - start) #用元組存儲(chǔ)這種拳手排盤圣勒,用時(shí)
這里input的作用是一個(gè)阻塞函數(shù),
結(jié)果:
(1, 'A', 1104.550999879837)
(2, 'F', 1105.4389998912811)
(3, 'H', 1106.231999874115)
(4, 'G', 1107.2069997787476)
(5, 'D', 1107.8709998130798)
(6, 'E', 1108.4069998264313)
(7, 'C', 1108.9429998397827)
(8, 'B', 1109.383999824524)
假設(shè)比賽結(jié)束了未玻,我們要公布成績灾而,我們要遍歷一下
In [21]: for k in d:
...: print k,d[k]
...:
輸出結(jié)果:
Jim (1, 35)
Leo (2, 37)
Bob (3, 40)
In [22]:
【知只補(bǔ)充】
pop() 函數(shù)
pop() 函數(shù)用于移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值扳剿。
pop()方法語法:
list.pop(obj=list[-1])
參數(shù)
obj -- 可選參數(shù)旁趟,要移除列表元素的對(duì)象。
返回值
該方法返回從列表中移除的元素對(duì)象庇绽。
實(shí)例
以下實(shí)例展示了 pop()函數(shù)的使用方法:
aList = [123, 'xyz', 'zara', 'abc']
print "A List : ", aList.pop()
print "B List : ", aList.pop(2)
以上實(shí)例輸出結(jié)果如下:
In [23]: aList = [123, 'xyz', 'zara', 'abc']
In [24]: print "A List : ", aList.pop()
A List : abc
In [25]: print "B List : ", aList.pop(2)
B List : zara
In [26]: print "A List : ", aList.pop()
A List : xyz
In [27]:
1-7 如何實(shí)現(xiàn)用戶的歷史記錄功能
【實(shí)際問題】
很多應(yīng)用程序都有瀏覽用戶的歷史記錄的功能锡搜,
例如:
瀏覽器可以查看最近訪問過的網(wǎng)頁
視頻播放器可以查看最近播放過視頻文件
shell可以查看用戶輸入過的命令
……
現(xiàn)在我們制作了一個(gè)簡單的猜字的小游戲,添加歷史記錄功能瞧掺,
顯示用戶最近猜過的數(shù)字耕餐,如何實(shí)現(xiàn)?
【分析思路】
在這里我們做一個(gè)限定辟狈,歷史記錄不可能是無限條肠缔,我們只讓他顯示最近5次的歷史記錄
【解決辦法】
我們可以使用容量為n的隊(duì)列存儲(chǔ)歷史記錄
使用標(biāo)準(zhǔn)庫collections中的deque,它是一個(gè)雙端循環(huán)隊(duì)列哼转。
程序退出前明未,可以使用pickle將對(duì)列對(duì)象存入文件,再次運(yùn)行程序時(shí)將其導(dǎo)入壹蔓。
首先我們導(dǎo)入deque
然后應(yīng)用這個(gè)函數(shù)創(chuàng)建一個(gè)隊(duì)列趟妥,前面為隊(duì)列的初始值,后面為隊(duì)列的容量
q = deque([],5)
對(duì)這個(gè)隊(duì)列佣蓉,每次從右邊進(jìn)行一個(gè)append操作
from collections import deque
In [32]: q.append(1)
In [33]: q
Out[33]: deque([1, 1])
In [34]: q.append(2)
In [35]: q.append(3)
In [36]: q.append(4)
In [37]: q
Out[37]: deque([1, 1, 2, 3, 4])
In [38]: q.append(5)
In [39]: q
Out[39]: deque([1, 2, 3, 4, 5])
In [40]: q.append(6)
In [41]: q
Out[41]: deque([2, 3, 4, 5, 6])
In [42]: q.append(7)
In [43]: q
Out[43]: deque([3, 4, 5, 6, 7])
In [44]:
這樣披摄,我們就可以用deque完成這樣的事情亲雪。
from collections import deque
from random import randint
N = randint(0,100)
history = deque([],5)
def guess(k):
if k == N:
print('right')
if k < N:
print("%s is less-than N" % k)
else:
print("%s is greater-than N" % k)
return False
while True:
line = raw_input("please input a number:")
if line.isdigit():
k = int(line)
history.append(k)
if guess(k):
break
elif line == "history" or line == 'h?':
print(list(history)) #以列表的形式展示
please input a number:50
50 is greater-than N
please input a number:49
49 is greater-than N
please input a number:48
48 is greater-than N
please input a number:20
20 is less-than N
please input a number:h?
[50, 49, 48, 20]
please input a number:60
60 is greater-than N
please input a number:90
90 is greater-than N
please input a number:h?
[49, 48, 20, 60, 90]
please input a number:
這樣這個(gè)功能就完成了,現(xiàn)在還有一個(gè)問題
對(duì)列deque是在內(nèi)存當(dāng)中的疚膊,程序退出后就消失了
這就需要將歷史記錄這個(gè)對(duì)象存在文件錄中
即將history這個(gè)對(duì)象保存
下次再load進(jìn)來
下面我們對(duì)pickle進(jìn)行介紹
它可以把一個(gè)python對(duì)象存儲(chǔ)到文件當(dāng)中义辕,也可以從文件當(dāng)中l(wèi)oad一個(gè)python對(duì)象
In [44]: import pickle
In [45]: pickle.dump?
Signature: pickle.dump(obj, file, protocol=None)
Docstring: <no docstring>
File: c:\python27\lib\pickle.py
Type: function
In [46]: pickle.dump(q,open('history','w'))
In [47]:
此時(shí)歷史記錄就保存在這個(gè)文件當(dāng)中了
下一次程序打開的時(shí)候,需要一個(gè)反向操作寓盗,load
In [47]: pickle.load?
Signature: pickle.load(file)
Docstring: <no docstring>
File: c:\python27\lib\pickle.py
Type: function
In [48]: q2=pickle.load(open('history'))
In [49]: q2
Out[49]: deque([3, 4, 5, 6, 7])
我們發(fā)現(xiàn)终息,q2和q是一致的,完畢贞让!