python 數據結構

python包含數據結構包含list列表、tuple元組、dict字典、set集合這些都是內置類型。collections模塊包含多種數據結構的實現,擴展了其他模塊中的相應結構。例如deque是一個雙端對列。從任意一端增加或刪除元素。defaultdict是一個字典,,如果找不到某個建,他會響應一個默認值,ordereddict會記住增加元素的序列。nametuple擴展了一個tuple處了為每個成員元素提供一個數值索引外還提供一個屬性名。
對于大量數據array會比list更高效地利用內存。由于array僅限一種數據類型,與通用的list相比,它可以采用一種更緊湊的內存表示
構建列表或數組還有一種選擇即bisect它即使一種二分查找算法查找新元素,效率較高。
盡管內置list可以使用insert、pop方法模擬隊列,但這不是線程安全的,要完成線程間的時序通信,可以使用queue模塊。multiprocessing包含一個queue的版本。他會處理進程進的他會處理進程間的通信。
struct對于解碼另一個應用的數據就會很有用,可以將這些數據解碼為python的內置類型,以便于處理。

collection——容器數據類型

collection模塊包含除內置類型list、dict和tuple外的其他類型。

counter

counter是一個容器,可以跟蹤相同的值增加了多少次,這個類可以用來實現其他語言中常用包bag或多集合multiset數據結構來實現的算法。
初始化counter有3中方法。調用counter的構造函數時可以提供一個元素序列或者一個包含鍵和計數的字典,還可以使用關鍵字參數將字符串名映射到計數器。
示例代碼如下:

import collections as co
print co.Counter(['a','b','c'])

Counter({'a': 1, 'c': 1, 'b': 1})

counter函數可以使用空參數,然后使用update進行填充,示例代碼如下:

c = collections.Counter()
print c

Counter()

c.update('abcdaab')
print c
Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})
print c

Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})

print
print c

Counter({'a': 3, 'b': 2, 'c': 1, 'd': 1})

c.update({'a':1,'d':5})
print c

Counter({'d': 6, 'a': 4, 'b': 2, 'c': 1})

一旦Counter填充結束,既可以用字典API獲取他的值。

import collections
c = collections.Counter()
c.update('abcdaab')
for letter in 'abcde':
print ' %s :%d' % (letter,c[letter])

   a  :  3
   b  :  2
   c  :  1
   d  :  1
   e  :  0

elements()方法返回一個迭代器,將生成counter知道的所有元素,但是包能保證元素的順序不變,且計數小于或等于0的元素不包含在內。

import collections
c = collections.Counter('extremely')
c['z'] = 0
print c
print list(c.elements())

['e', 'e', 'e', 'm', 'l', 'r', 't', 'y', 'x']

使用most_common()可以生成一個序列,其中包含n個最常遇到的輸入值及相應計數
示例代碼如下:

import collections
c = collections.Counter()
with open('/usr/share/dict/words','rt') as f:
for line in f:
c.update(line.rstrip().lower())
print
for letter, count in c.most_common(3):
print '%s: %7d' % (letter, count)
算術操作
Counter實例支持算術和集合操作來完成結果的聚集。

defaultdict

標準字典包括一個方法setdefault()來獲取一個值,如果這個值不存在則建立一個默認值,與之相反,defaultdict初始化容器時會讓調用者提前指定默認值。

import collections
def default_factory():
return 'default value'
d = collections.defaultdict(default_factory,foo='bar')
print 'd:',d
print 'foo=>',d['foo']
print 'bar =>',d['bar']

default value

deque 雙端隊列

deque雙端隊列支持從任意一端增加和刪除元素,更為常見的方式是棧和隊列就是雙端隊列的退化形式。其輸入和輸出限制在一端。
代碼示例如下:

import collections
d = collections.deque('abcdefg')
print 'deque:', d
print 'length:',len(d)
print 'left end:',d[0]
print 'right end:',d[-1]
d.remove('c')
print 'remove(c)',d
right右端添加示例代碼:
import collections
d1 = collections.deque()
d1.extend('abcdefg')
d1.append('h')
print d1
left左端代碼示例:
d2 = collections.deque()
d2.extend(xrange(6))
d2.appendleft(6)
print d2
同過進程分別由兩端調用示例如下:
import collections
import threading
import time
candle = collections.deque(xrange(5))
def burn(direction, nextSource):
... while True:
... try:
... next = nextSource()
... except IndexError:
... break
... else:
... print '%8s: %s' % (direction, next)
... time.sleep(0.1)
... print ' %8s done' % direction
... return
left= threading.Thread(target=burn, args=('Left',candle.popleft))
right = threading.Thread(target=burn, args=('right',candle.pop))
left.start()
deque 可以按任意一個方向旋轉,而跳過一些元素。deque向右旋轉使用一個正直會從又端取元素,把他們移到左端,向左旋轉,使用一個負數,則從左端將元素移至右端。可以理解為撥號盤。示例代碼如下:
import collections
d =collections.deque(xrange(10))

print d

deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

d = collections.deque(xrange(10))
print d

deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

d.rotate(2)
print d

deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])

d = collections.deque(xrange(10))
d.rotate(-2)
print d

deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

namedtuple

標準tuple使用數值索引來訪問其成員,namedtuple使用數值索引的同時還支持通過名字指定元素

import collections
person = collections.namedtuple('person','name age gender')
print type(person)

<type 'type'>

bob = person(name='bob',age =30,gender='male')
print bob

person(name='bob', age=30, gender='male')

jane = person(name = 'jane',age = 20, gender='female')
print jane
person(name='jane', age=20, gender='female')
print jane.name
jane
print jane.age
20
print jane.gender
female
person1 = collections.namedtuple('person','name age sex')
bob = person1(name='s',age=20,sex='f')
print bob
person(name='s', age=20, sex='f')

namedtuple如果使用重復字段名或者系統保留字段名將引起異常,如下:

import collections
try:
... collections.namedtuple('person','name class age gender')
... except ValueError, err:
... print err
...
Type names and field names cannot be a keyword: 'class'
try:
... collections.namedtuple('person','name age gender age')
... except ValueError, err:
... print err
...
Encountered duplicate field name: 'age'

OrderdDict

OrderdDict是一個字典子類,可以記住其內容增加的順序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容