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是一个字典子类,可以记住其内容增加的顺序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容