第1章數(shù)據(jù)結(jié)構(gòu)與算法

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磅网。

  1. 使用Python寫一些執(zhí)行腳本時(shí)谈截,使用lambda可以省去定義函數(shù)的過程,讓代碼更加精簡涧偷。
  2. 對(duì)于一些抽象的簸喂,不會(huì)別的地方再復(fù)用的函數(shù),有時(shí)候給函數(shù)起個(gè)名字也是個(gè)難題燎潮,使用lambda不需要考慮命名的問題瞻鹏。
  3. 使用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是一致的,完畢贞让!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柳譬,隨后出現(xiàn)的幾起案子喳张,更是在濱河造成了極大的恐慌,老刑警劉巖美澳,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件销部,死亡現(xiàn)場離奇詭異,居然都是意外死亡制跟,警方通過查閱死者的電腦和手機(jī)舅桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雨膨,“玉大人擂涛,你說我怎么就攤上這事×募牵” “怎么了撒妈?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長排监。 經(jīng)常有香客問我狰右,道長,這世上最難降的妖魔是什么舆床? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任棋蚌,我火速辦了婚禮,結(jié)果婚禮上挨队,老公的妹妹穿的比我還像新娘谷暮。我一直安慰自己,他們只是感情好瞒瘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布坷备。 她就那樣靜靜地躺著,像睡著了一般情臭。 火紅的嫁衣襯著肌膚如雪省撑。 梳的紋絲不亂的頭發(fā)上赌蔑,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音竟秫,去河邊找鬼娃惯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肥败,可吹牛的內(nèi)容都是我干的趾浅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馒稍,長吁一口氣:“原來是場噩夢啊……” “哼皿哨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纽谒,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤证膨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鼓黔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體央勒,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年澳化,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崔步。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缎谷,死狀恐怖井濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情列林,我是刑警寧澤眼虱,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站席纽,受9級(jí)特大地震影響捏悬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜润梯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一过牙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纺铭,春花似錦寇钉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竟纳,卻和暖如春撵溃,著一層夾襖步出監(jiān)牢的瞬間疚鲤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工缘挑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留集歇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓语淘,卻偏偏與公主長得像诲宇,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惶翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容