集合 堆 和 双端队列
1.集合
创建集合
s = set(range(10))
和字典一样,集合元素的顺序是随意的,因此不能以元素的顺序作为依据编程
集合支持的运算
a = set([1,2,3])
b = set([2,3,4])
other = set([99,98,97]) #|
c = a | b
print (c)
print (a.union(b)) #&
c = a&b
print (c)
print (a.intersection(b)) #-
c = a - b
print (c)
print (a.difference(b)) #^
c = a ^ b
print (c)
a.symmetric_difference(b) print (c.issubset(a))
print (c <= a)
print (c >= a)
若需要集合中包含集合 可以这样
#error
a.add(b)
#right
print (a.add(frozenset(b)))
2.堆
这是优先队列的一种 使用优先队列能够以任意顺序增加对象,而且能在极短时间内 找到 最小的元素
heappush(heap,x) | 将x入堆 |
heappop(heap) | 将堆中对小的元素弹出 |
heapify(heap) | 将heap属性强制应用到任意一个列表 |
heapreplace(heap,x) | 将堆中最小元素弹出,同时将x入堆 |
nlargest(n,iter) | 返回iter中第n大的元素 |
nsmallest(n,iter) | 返回iter中第n大的元素 |
from heapq import *
from random import shuffle
data = list(range(10))
shuffle(data)
heap = []
for n in data:
heappush(heap,n) print ('init')
print (heap) print ('pop 3 min elements')
print (heappop(heap))
print (heappop(heap))
print (heappop(heap)) print ('show')
print (heap) print ('pop and push 0.5')
heapreplace(heap,0.5)
print (heap)
注意:显示(print)的堆(heap) 是按标准数组形式的表示的 (即i位置处的元素总比2*i以及2*i + 1位置处的元素小 ) 好像就是创建了最小堆 :)
3.双端队列
在需要按照元素增加的顺序来移除元素时非常有用
from collections import deque
q = deque(range(5))
print (q) print ('#q.append(5) q.appendleft(6)')
q.append(5)
q.appendleft(6)
print (q) print ('#q.pop()')
q.pop()
print (q) print ('#q.popleft()')
q.popleft()
print (q) print ('#q.rotate(3)')
q.rotate(3)
print (q)
双端队列好用的原因是他能够有效的在开头(左侧)增加和弹出元素 这是在列表中无法实现的。
除此之外,使用双端队列的好处是:能够有效的旋转元素(rotate)(也就是将它们左移或者右移,使头尾相连)
time
time模块所包括的函数能够实现以下功能:获得当前时间 操作时间和日期 从字符串读取时间以及格式化时间为字符串。
asctime([tuple]) | 将时间元组转换为字符串 |
localtime([secs]) | 将秒数转换为日期元组,以本地时间为准 |
mktime(tuple) | 将时间元组转换为本地时间 |
sleep(secs) | 休眠(不作任何事情)secs秒 |
strptime(string[,format]) | 将字符串解析为时间元组 |
time() | 当前时间(UTC) |
Python还提供了两个和时间密切相关的函数 datetime(支持日期和时间的算法) 和 timeit(帮组开发人员对代码段的执行时间计时)
random
random模块包含了返回随机数的函数,可以用来模拟或者产生随机输出的程序
注意:如果真的需要随机性,应该使用os模块的urandom函数
random() | 返回(0,n]之间的随机数 |
getrandbits() | 以长整形式返回n个随机位 |
uniform() | 返回随机实数n,其中[a,b) |
randrange([start],stop,[step]) | 返回range(start,stop,step)中的随机数 |
choice(seq) | 从序列seq中返回随意元素 |
shuffle(seq[,random]) | 原地指定序列seq |
sample(seq,n) | 从序列seq中选择n个随机且独立的元素 |
random和time示例:
随机获取区域内时间
from time import *
from random import * date1 = (2008,1,1,0,0,0,-1,-1,-1)
date2 = (2009,1,1,0,0,0,-1,-1,-1) time1 = mktime(date1)
time2 = mktime(date2)
random_time = uniform(time1,time2)
print (asctime(localtime(random_time)))