青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Sivan's blog

用代碼說話……
posts - 14, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

[學]Python用戶手冊筆記_2_Data Structures

Posted on 2010-12-19 15:25 Sivan 閱讀(297) 評論(0)  編輯 收藏 引用 所屬分類: Python

Data Structures
數據結構

4 數據結構

4.1 深入鏈表

append(x)   把一個元素添加到鏈表的結尾。

extend(L)   通過添加指定鏈表的所有元素來擴充鏈表。

insert(i,x) 在指定位置插入一個元素。

remove(x)   刪除鏈表中值為x的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。

pop([i])    從鏈表的指定位置刪除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個元素。元素隨即從鏈表中被刪除。

index(x)    返回鏈表中第一個值為x的元素的索引。如果沒有匹配的元素就會返回一個錯誤。

count(x)   返回x在鏈表中出現的次數。

sort()     就地對鏈表中的元素進行排序。

reverse()  就地對鏈表中的元素進行倒排序。

4.1.1 把鏈表當作堆棧使用

鏈表方法使得鏈表可以很方便的作為一個堆棧來使用。堆棧為后進先出。用append()方法可以把一個元素添加到堆棧頂。用不指定索引的pop()方法可以把一個元素從堆棧頂釋放出來。

>>> stack = [3, 4, 5]

>>> stack.append(6)

>>> stack

[3, 4, 5, 6]

>>> print stack

[3, 4, 5, 6]

>>> stack.pop()

6

>>> stack

[3, 4, 5]

>>> 


4.1.2
把鏈表當作隊列使用

也可以把鏈表當作隊列使用,隊列作為特定的數據結構,最先進入的元素最先釋放。使用append()方法可以把元素添加到隊列最后,以0為參數調用pop()方法可以把最先進入的元素釋放出來。

>>> queue = ["Eric", "John", "Michael"]

>>> queue.append("Terry")

>>> queue.append("Graham")

>>> queue

['Eric', 'John', 'Michael', 'Terry', 'Graham']

>>> queue.pop(0)

'Eric'

>>> queue

['John', 'Michael', 'Terry', 'Graham']

>>> 


4.1.3
函數化編程工具

鏈表中有三個內置函數非常有用:filter(),map()reduce()

filter(function, sequence)返回一個sequence,包括了給定序列中所有調用function后返回值為true的元素。如果sequence是一個string或者tuple,返回值必行是同一類型,否則,它總是list

>>> def f(x):return x % 2 != 0 and x%3 != 0

...

>>> filter(f, range(2, 25))

[5, 7, 11, 13, 17, 19, 23]

>>>

map(function, sequence)為每一個元素依次調用function(item)并將返回值組成一個鏈表返回。

>>> def cube(x): return x*x*x

...

>>> map(cube, range(1, 11))

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>>

可以傳入多個序列,函數也必須要有對應數量的參數,執行時會依次用各序列上對應的元素來調用函數。如果某些序列比其它的短,就用None來代替。如果把None做為一個函數傳入,則直接返回參數做為替代。

>>> seq = range(8)

>>> def add(x, y): return x+y

...

>>> map(add, seq, seq)

[0, 2, 4, 6, 8, 10, 12, 14]

>>>

reduce(func, sequence)返回一個單值,它是這樣構造的:首先以序列的前兩個元素調用函數,再以返回值和第三個參數調用,依次執行下去。

>>> def add(x, y): return x+y

...

>>> reduce(add, range(1, 11))

55

>>>

如果序列中只有一個元素,就返回它,如果序列是空的,就拋出一個異常。

可以傳入第三個參數做為初始值。如果序列是空的,就返回初始值,否則函數會先接收初始值和序列的第一個元素,然后是返回值和下一個原色,依次類推。例如:

>>> def sum(seq):

...     def add(x,y): return x+y

...     return reduce(add, seq, 0)

...

>>> sum(range(1,11))

55

>>> sum([])

0

>>>


4.1.4
鏈表推導式

鏈表推導式提供了一個創建鏈表的簡單途徑,無須使用map(),filter()以及lambda。返回鏈表的定義通常比創建這些鏈表更清晰。每一個鏈表推導式包括一個for語句之后的表達式,零或多個forif語句。返回值是由forif字句之后的表達式得到的元素組成的鏈表。如果想得到一個元組,必須要加上括號。

>>> freshfruit = ['banana','loganberry','passion fruit']

>>> [weapon.strip() for weapon in freshfruit]

['banana', 'loganberry', 'passion fruit']

>>> vec = [2, 4, 6]

>>> [3*x for x in vec]

[6, 12, 18]

>>> [3*x for x in vec if x<2]

[]

>>> [3*x for x in vec if x<4]

[6]

>>> [[x,x**2] for x in vec]

[[2, 4], [4, 16], [6, 36]]

>>> vec1 = [2, 4, 6]

>>> vec2 = [4, 3, -9]

>>> [x*y for x in vec1 for y in vec2]

[8, 6, -18, 16, 12, -36, 24, 18, -54]

>>> [[x,x*2] for x in vec]

[[2, 4], [4, 8], [6, 12]]

>>> [x+y for x in vec1 for y in vec2]

[6, 5, -7, 8, 7, -5, 10, 9, -3]

>>> [vec1[i]*vec2[i] for i in range(len(vec1))]

[8, 12, -54]

>>>

鏈式推導式比map()更復雜,可使用復雜的表達式和嵌套函數。

>>> [str(round(355/113.0,i)) for i in range(1,6)]

['3.1', '3.14', '3.142', '3.1416', '3.14159']

>>>


4.2 del
語句

有一個方法可從鏈表中刪除指定索引的元素:del語句。與返回變量值的pop()方法不同,del語句也可以從一個鏈表中移走切割部分或者整個鏈表。

>>> a = [-1, 1 , 66.25, 333, 333, 1234.5]

>>> del a[0]

>>> a

[1, 66.25, 333, 333, 1234.5]

>>> del a[2]

>>> a

[1, 66.25, 333, 1234.5]

>>> del a[2:4]

>>> a

[1, 66.25]

>>>

del也可以用于刪除整個變量:

>>> del a

>>> a

Traceback (most recent call last):

  File "<interactive input>", line 1, in <module>

NameError: name 'a' is not defined

>>>

此后再引用這個名字會發生錯誤(至少要到給它賦另外一個值為止)。

4.3 元組和序列

鏈表和字符串有很多通用的屬性,如索引和切割操作。它們是序列類型中的兩種。

有一種標準序列類型:元組。一個元組由數個逗號分隔的值組成。

>>> t = 12345, 54321, 'hello'

>>> t[0]

12345

>>> t

(12345, 54321, 'hello')

>>> u = t, (1, 2, 3)

>>> u

((12345, 54321, 'hello'), (1, 2, 3))

>>>

元組也可能是容器

元組在輸出時總是有括號的,以便于正確表達嵌套結構。在輸入時可能有或沒有括號都可以,不過經常括號都是必須的。

元組由很多用途。例如(x,y)坐標點,數據庫中的員工記錄等等。元組就像字符串,不可改變:不能給元組的一個獨立的元素賦值(盡管可以通過聯接和切割來模仿)。也可以通過包含可變對象來創建元組,例如鏈表。

構造零個元素的元組,使用空的括號創建。構造有一個單元素元組可以在值后面跟一個逗號。例如:

>>> empty = ()

>>> singletuple = 'hello',

>>> len(empty)

0

>>> len(singletuple)

1

>>> singletuple

('hello',)

>>>

語句t = 123, 321, 'niky'是元組封裝的一個例子:值123,321,‘niky’被封裝進元組。其逆操作可能是這樣:

>>> t = 123, 321, 'niky'

>>> x, y, z = t

>>> x

123

>>> y

321

>>> z

'niky'

>>>

這個調用被稱為序列拆封非常合適。序列拆封要求左側的變量數目與序列的元素個數相同。要注意的是可變參數其實只是元組封裝和序列拆封的一個結合。

這里有一點不對稱:封裝多重參數通常會創建一個元組,而拆封操作可以作用于任何序列。

4.4 集合

Python還包含了一個數據類型set。集合是一個無序不重復元素的集。基本功能包括關系測試和消除重復元素。集合對象還支持unionintersectiondifferencesysmmetric difference(對稱差集)等數學運算。

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']

>>> fruit = set(basket)

>>> fruit

set(['orange', 'pear', 'apple', 'banana'])

>>> 'orange' in fruit

True

>>> # 演示集合操作

>>> a = set('abracadabra')

>>> b = set('alacazam')

>>> a

set(['a', 'r', 'b', 'c', 'd'])

>>> b

set(['a', 'c', 'z', 'm', 'l'])

>>> a - b # a中有,而b中沒有

set(['r', 'b', 'd'])

>>> a | b # a 或者 b

set(['a', 'c', 'b', 'd', 'm', 'l', 'r', 'z'])

>>> a & b

set(['a', 'c'])

>>> a ^ b # ab中,但不會同時在ab

set(['b', 'd', 'm', 'l', 'r', 'z'])

>>>


4.5
字典

字典在某些語言中可能稱為“聯合內存”或“聯合數組”。序列是以連續的整數位索引,與此不同的是,字典以關鍵字為索引,關鍵字可以是任意不可變類型,通常用字符串或數值。如果元組中只包含字符串和數字,它可以做為關鍵字,如果它直接或間接的包含了可變對象,就不能當作關鍵字。不能用鏈表做關鍵字,因為鏈表可以用索引、切割或者append()extend()等方法改變。

字典可以看做是無序的關鍵字:值對集合,關鍵字必須是互不相同的。一對大括號創建一個空的字典{}。初始化鏈表時,在大括號內放置一組逗號分隔的關鍵字:值對,這也是字典輸出的方式。

字典的主要操作是依據關鍵字來存儲和析取值。也可以用del來刪除關鍵字:值對。如果用一個存在的關鍵字存儲值,以前為該關鍵字分配的值會被遺忘。試圖從一個不存在的關鍵字中析取值會導致錯誤。

keys()返回由所有關鍵字組成的鏈表,該鏈表順序不定。使用字典的has_key()方法或in關鍵字可以檢查字典中是否存在某一關鍵字。

>>> tel = {'jack':4088, 'sivan':8888}

>>> tel

{'sivan': 8888, 'jack': 4088}

>>> tel['niky'] = 6666

>>> tel

{'sivan': 8888, 'niky': 6666, 'jack': 4088}

>>> tel['niky']

6666

>>> del tel['jack']

>>> tel

{'sivan': 8888, 'niky': 6666}

>>> tel.keys()

['sivan', 'niky']

>>> tel.has_key('niky')

True

>>> 'niky' in tel

True

>>>

鏈表中存儲關鍵字-值對元組的話,dict()可以從中直接構造字典。關鍵字-值對來自某個特定模式時,可以用鏈表推導式簡單的生成關鍵字-值鏈表。

>>> dict([('sape',4139),('guido',4127),('jack',4098)])

{'sape': 4139, 'jack': 4098, 'guido': 4127}

>>> dict([(x,x**2) for x in (2,4,6)])

{2: 4, 4: 16, 6: 36}

>>> [(x,x**2) for x in (2,4,6)]

[(2, 4), (4, 16), (6, 36)]

>>>

使用簡單字符串作為關鍵字的話,通常用關鍵字參數更簡單

>>> dict(sape=4139, guido=4127, jack=4098)

{'sape': 4139, 'jack': 4098, 'guido': 4127}

>>> 


4.6
循環技術

在字典中循環時,關鍵字和對應的值可以使用iteritems()方法同時解讀出來

>>> knight = {'gallahad':'the pure','robin':'the brave'}

>>> for k, v in knight.iteritems():

...     print k, v

...    

gallahad the pure

robin the brave

>>>

在序列中循環時,索引位置和對應值可以使用enumerate()函數同時得到。

>>> for i, v in enumerate(['a','b','c']): # 在鏈表中

...     print i, v

...    

0 a

1 b

2 c

>>> t = 'a', 'b', 'c'

>>> for m, n in enumerate(t): #在元組中

...     print m, n

...    

0 a

1 b

2 c

>>>

同時循環兩個或更多的序列,可以使用zip()整體解讀。

>>> seq1 = ['1', '2', '3']

>>> seq2 = ['a', 'b', 'c']

>>> for m, n in zip(seq1, seq2):

...     print 'L-%s,R-%s' % (m,n)

...    

L-1,R-a

L-2,R-b

L-3,R-c

>>>

需要逆向循環序列的話,先正向定位序列,然后調用reversed()函數

>>> for i in reversed(xrange(1,10,2)):

...     print i

...    

9

7

5

3

1

>>> for i in reversed(range(1,10,2)):

...     print i

...    

9

7

5

3

1

>>>

要俺排序后的順序循環序列的話,使用sorted()函數,它不改動原序列,而是生成一個新的排好序的序列

>>> seq = ['c','a','b','e','d']

>>> for i in sorted(set(seq)):

...     print i

...    

a

b

c

d

e

>>> 


4.7
深入條件控制

whileif語句中使用的條件不僅可以使用比較,而且可以包含任意的操作。

innot in比較操作符審核值是否在一個區間之內。操作符isis not比較兩個對象是否相同;這只和像鏈表這樣的可變對象有關。所有的比較操作符具有相同的優先級,地獄所有的數值操作。

比較操作可以傳遞。例如a < b == c審核是否a小于b并且b等于c

比較操作可以通過邏輯操作符andor組合,比較的結果可以用not來取反。這些操作符的優先級又低于比較操作符,這些運算符中,not具有最高優先級,or優先級最低。所以A and not B or C等于(A and not B)) or C

邏輯操作符andor也稱作短路操作符:它們的參數從左向右解析,一旦結果可以確定就停止。作用域一個普通的非邏輯值時,短路操作符的返回值通常是最后一個變量。

可以把比較或其它邏輯表達式的返回值賦給一個變量。

>>> string1,string2,string3 = '', 'Trondheim', 'Hammer Dance'

>>> non_null = string1 or string2 and string3

>>> non_null

'Hammer Dance'

>>> non_null = string1 or string2 or string3

>>> non_null

'Trondheim'

>>> string4 = 'hello'

>>> non_null = string1 or string2 or string3 or string4

>>> non_null

'Trondheim'

>>> non_null = string1 or string2 or string3 and string4

>>> non_null

'Trondheim'

>>> non_null = string1 and string2 or string3

>>> non_null

'Hammer Dance'

>>>

PythonC不同,在表達式內部不能賦值。所以在Python中不會出現這樣的錯誤:想要在解析式中使用==時誤用了=操作符。


4.8
不同序列類型的比較

序列對象可以與相同類型的其它對象比較。比較操作按字典序列進行:首先比較前兩個元素,如果不同,就決定了比較的結果;如果相同,就比較厚兩個元素,依此類推,直到所有序列都完成比較。如果兩個元素本身就是同樣類型的序列,就遞歸字典序比較。如果兩個序列的所有子項都相等,就認為序列相等。如果一個序列是另一個序列的初始子序列,較短的一個序列就小于另一個。字符串的字典序按照單字符的ASCII順序。

>>> seq1 = 1, 2, 3

>>> seq2 = 1, 2, 5

>>> print seq1 < seq2

True

>>> seq3 = [1, 2, 3]

>>> seq4 = [1, 2, 5]

>>> print seq3 < seq4

True

>>> seq5 = 1, 2, 3

>>> seq6 = 1.0, 2.0, 3.0

>>> print seq5 == seq6

True

>>> print (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)

True

>>>

不同類型的對象比較是合法的。輸出結果是確定而非任意的:類型按它們的名字排序。因此,一個鏈表list總是小于一個字符串string,一個字符串string總是小于一個元組等等。數值比較時會統一它們的數據類型,所以0等于0.0,等等。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美视频四区| 亚洲精品国偷自产在线99热| 欧美视频在线观看一区| 欧美久色视频| 欧美高清影院| 欧美大片91| 欧美成人免费全部| 亚洲人体偷拍| 亚洲午夜在线观看| 西西人体一区二区| 久久久一本精品99久久精品66| 久久精品亚洲精品| 欧美a级片网| 欧美性猛交xxxx乱大交退制版| 国产精品视频精品视频| 国产在线一区二区三区四区| 亚洲高清一区二| 亚洲永久免费av| 久久综合久久综合久久| 欧美激情成人在线视频| aa成人免费视频| 久久久久久久97| 欧美日韩亚洲一区二区| 国产一区二区精品| 中日韩男男gay无套| 久久综合久久综合九色| 亚洲精品中文字幕女同| 亚洲一区二区三区乱码aⅴ| 久久亚洲春色中文字幕| 国产精品久久午夜夜伦鲁鲁| 亚洲大胆女人| 欧美影院视频| 日韩网站在线观看| 乱中年女人伦av一区二区| 国产精品女人毛片| 99视频一区| 欧美激情bt| 久久久精品国产一区二区三区 | 999亚洲国产精| 久久精品99国产精品| 亚洲欧洲视频| 毛片av中文字幕一区二区| 国产视频在线观看一区| 亚洲女性裸体视频| 亚洲精选一区| 欧美激情一区二区三区成人| 黄色国产精品一区二区三区| 欧美一级黄色网| 亚洲视频播放| 欧美日韩在线一区二区三区| 亚洲美女诱惑| 亚洲国产人成综合网站| 久久伊伊香蕉| 亚洲国产激情| 欧美韩日高清| 老妇喷水一区二区三区| 伊大人香蕉综合8在线视| 久久精彩视频| 欧美呦呦网站| 黄色日韩在线| 欧美二区不卡| 欧美顶级艳妇交换群宴| 久久九九国产精品怡红院| 国产精品久久久久婷婷| 国产精品99久久久久久久vr | 日韩一级精品视频在线观看| 久久久久免费视频| 在线日韩视频| 亚洲国产第一| 欧美激情中文不卡| 在线视频你懂得一区| 国产综合欧美| 久久深夜福利免费观看| 欧美资源在线| 亚洲高清久久网| 亚洲大片av| 欧美视频不卡中文| 亚洲欧美日韩一区二区在线| 亚洲视频中文字幕| 国产一区二区三区无遮挡| 榴莲视频成人在线观看| 欧美刺激性大交免费视频| 一本到12不卡视频在线dvd| av成人免费在线观看| 国产情人节一区| 欧美电影打屁股sp| 欧美午夜a级限制福利片| 久久av二区| 男人的天堂亚洲| 亚洲专区国产精品| 久久久久久尹人网香蕉| 亚洲免费av观看| 国产精品国码视频| 在线观看亚洲视频| 亚洲人成网站色ww在线| 欧美性猛交一区二区三区精品| 久久国产精品亚洲77777| 乱中年女人伦av一区二区| 亚洲影院在线观看| 久久免费国产| 亚洲尤物在线视频观看| 久久久亚洲高清| 亚洲欧美国产va在线影院| 久久久久www| 亚洲一区制服诱惑| 亚洲欧美日本精品| 欧美本精品男人aⅴ天堂| 国产精品福利久久久| 欧美~级网站不卡| 国产精品一区久久久久| 亚洲人成人99网站| 影音先锋日韩精品| 亚洲欧美成人在线| 在线一区二区三区四区| 久热这里只精品99re8久| 久久精品一区二区国产| 国产精品一区二区三区免费观看 | 久久香蕉精品| 久久精品亚洲乱码伦伦中文 | 国产麻豆日韩欧美久久| 欧美激情四色| 国内精品久久久久影院优| 国产精品99久久不卡二区| 日韩亚洲欧美精品| 久久综合亚洲社区| 美国十次了思思久久精品导航| 国产精品日韩欧美一区| 一区二区三区不卡视频在线观看| 亚洲人屁股眼子交8| 久久久久久久高潮| 久久亚洲精品中文字幕冲田杏梨| 国产精品视频精品| 亚洲欧美视频在线| 国外视频精品毛片| 亚洲欧美日本伦理| 亚洲第一福利视频| 亚洲成人在线网| 久久另类ts人妖一区二区| 在线观看91精品国产麻豆| 久久国产精品网站| 久久蜜臀精品av| 国产精品美女久久久久久免费| 亚洲欧洲日产国产网站| 亚洲美女在线视频| 欧美日韩国产成人在线观看| 亚洲毛片在线观看.| 亚洲午夜视频在线观看| 国产精品sm| 亚洲免费视频在线观看| 久久激情视频久久| 在线观看亚洲a| 欧美激情一区二区在线| 亚洲手机在线| 久久在精品线影院精品国产| 亚洲高清色综合| 欧美日韩中文| 翔田千里一区二区| 欧美成年人视频网站欧美| 日韩视频一区二区在线观看 | 国产精品人成在线观看免费| 亚洲欧美在线播放| 免费成人黄色| 一本色道久久88精品综合| 国产精品v欧美精品∨日韩| 欧美一区二区三区在线观看| 欧美成年人网站| 亚洲一区综合| 伊人夜夜躁av伊人久久| 欧美日韩视频免费播放| 欧美一区在线看| 亚洲每日在线| 久久亚洲影音av资源网| 99精品国产福利在线观看免费| 欧美午夜不卡| 久久中文在线| 亚洲男女自偷自拍图片另类| 欧美aa国产视频| 国产精品久久久久久久第一福利| 午夜精品区一区二区三| 91久久精品日日躁夜夜躁国产| 亚洲一区二区免费看| 一区二区三区在线不卡| 欧美日一区二区三区在线观看国产免 | 亚洲国产欧美久久| 国产精品日韩在线观看| 美腿丝袜亚洲色图| 亚洲欧美视频一区| 日韩小视频在线观看| 免费欧美高清视频| 久久成人免费电影| 亚洲天堂成人在线视频| 亚洲国产视频直播| 国产日韩欧美精品综合| 欧美日韩亚洲视频| 欧美精品 日韩| 免费视频久久| 久久精品国产久精国产爱| 亚洲午夜在线观看视频在线| 亚洲欧洲日韩在线| 欧美黄色aaaa|