python数据结构(一)

collections --容器数据类型,collections模块包含了除内置类型list,dict和tuple以外的其他容器数据类型。 

Counter 作为一个容器可以追踪相同的值增加了多少次

#初始化
print(collections.Counter('qweqwe'))
print(collections.Counter(['q','w','e','q','w','e']))
print(collections.Counter(q=2,w=2,e=2,))
print(collections.Counter({'q':2,'w':2,'e':2}))

结果:
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
#构造空的Counter,使用update()填充
c = collections.Counter()
print(c)
c.update('qweqwe')
print(c)
c.update(['q','e','w','w'])
c.update({'q':2,'e':2})#计数值会增加,替换数据不会改变计数
c.update('qqew')
print(c)

结果:
Counter()
Counter({'w': 2, 'e': 2, 'q': 2})
Counter({'q': 7, 'e': 6, 'w': 5})
# 访问计数,一旦填充了Counter,可以使用 字典api获取他的值
b = collections.Counter('qwedwewqsa')
for letter in 'qwedz':
    print('%s:%d'%(letter,b[letter]),end=',')

b['x']=0
print(b)
print(list(b.elements()))#elements()返回一个迭代器,将生成Counter中的所有元素,但是不包括计数小于或者等于0的元素

string1 = '这是一段测试文文文字,这用来测试数据数数数结构常常判断数据是否可以正常使用,常用的正常的测试文章结果结构构造'
s = collections.Counter(string1)
for letter,count in s.most_common(3): #most_common()生成一个序列,其中包含n个最常遇到的输入值和相应的计数
    print('%s:%d'%(letter,count),end='|')

结果:
q:2,w:3,e:2,d:1,z:0,Counter({'w': 3, 'q': 2, 'e': 2, 's': 1, 'a': 1, 'd': 1, 'x': 0})
['q', 'q', 's', 'e', 'e', 'w', 'w', 'w', 'a', 'd']
数:5|常:5|文:4|
#算术操作
c1 = collections.Counter('qqqwwweeedx')
c2 = collections.Counter(['q','q','w','w','e','e','d','v'])
print(c1-c2)#每次通过一次操作生成新的Counter时候,计数为0或者负数会被删除
print(c1+c2)
print(c1&c2)
print(c1|c2)

结果:
Counter({'x': 1, 'w': 1, 'e': 1, 'q': 1})
Counter({'e': 5, 'w': 5, 'q': 5, 'd': 2, 'x': 1, 'v': 1})
Counter({'w': 2, 'e': 2, 'q': 2, 'd': 1})
Counter({'e': 3, 'w': 3, 'q': 3, 'x': 1, 'd': 1, 'v': 1})

 defaultdict 初始化容器时候会先让调用者提前指定默认值

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory,foo='bar')
print(d)
print(d['foo'],d['bar'],d['par'])

结果:
defaultdict(<function default_factory at 0x00000233EF0B7F28>, {'foo': 'bar'})
bar default value default value

deque(双端队列),支持从任意一端增加和删除元素,更为常见的两种结构,栈与队列,就是双端队列的退化形式,其输入和输出限制在一端

d = collections.deque('asdzxc')
print(d,len(d),('left end:',d[0]),('right end',d[-1]))
d.remove('d')
print('remove(d):',d)#deque属于序列容器,支持list的一些操作

结果:
deque(['a', 's', 'd', 'z', 'x', 'c']) 6 ('left end:', 'a') ('right end', 'c')
remove(d): deque(['a', 's', 'z', 'x', 'c'])
# 填充
d1 = collections.deque()
d1.extend('abcdefg')#迭代处理其输入
print('extend:',d1)
d1.append('hijk')
print('append',d1)
d1.extendleft('lmn')
print('extendleft:',d1)
d1.appendleft('opq')
print('appendleft',d1)

结果:
extend: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
append deque(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
extendleft: deque(['n', 'm', 'l', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
appendleft deque(['opq', 'n', 'm', 'l', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
#使用,可以从任意一端取deque的元素
print('from right')
d = collections.deque('abcdefg')
while True:
    try:
        print(d.pop(),end=',')
    except IndexError:
        break
print()
print('from left')
n = collections.deque(range(6))
while True:
    try:
        print(n.popleft(),end=',')
    except IndexError:
        break

结果:
from right
g,f,e,d,c,b,a,
from left
0,1,2,3,4,5,
#使用不同线程同时从两端利用双端队列的内容
import threading
import time
candle  = collections.deque(range(5))
def burn(direction,nextSource):
    while True:
        try:
            next=nextSource()
        except IndexError:
            break
        else:
            print('%8s:%s'%(direction,next))
            time.sleep(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()
right.start()

left.join()
right.join()

结果:
    left:0
   right:4
   right:3
    left:1
    left:2
   right done
    left done
#旋转,按照任意一个方向旋转,跳过一些元素
d = collections.deque(range(10))
print(d)
d.rotate(2)#使用正值,会从右端取数据移动到左端
print(d)
d.rotate(-4)#使用负值,会从左端取数据移动到右端
print(d)

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

 OrderedDict是一个字典的子类,可以记住其内容增加的顺序,是有序的


d = collections.OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3

for k,v in d.items():
print(k,v)

d1 = collections.OrderedDict()
d1['a'] = 1
d1['b'] = 2
d1['c'] = 3

d2 = collections.OrderedDict()
d2['b'] = 2
d2['a'] = 1
d2['c'] = 3

print(d1==d2)
结果: 

a 1
b 2
c 3
False

 

posted @ 2018-05-24 01:48  Mr.SSC  阅读(332)  评论(0编辑  收藏  举报