第24篇 collections模块 双端队列 命名元组 有序字典 默认字典

sys模块是指与python解释器沟通的模块
os模块是与操作系统交互的模块

python的工作路径相关的操作
os.getcwd 获取当前的动作目录 get current working dir
os.chdir 更改工作路径 change dir


用递归的方法计算5的阶乘
递归的原理 先递 后归
def fn(n):
if n == 1:return 1
else:
return fn(n-1)*n
print(fn(5))
return 1*2*3*4*5
def fn(5):
    if 5 == 1:return 1
    else:
        return fn(4)*5

def fn(4):
    if 4 == 1:return 1
    else:
        return fn(3)*4

def fn(3):
    if 3 == 1:return 1
    else:
        return fn(2)*3

def fn(2):
    if 2 == 1:return 1
    else:
        return fn(1)*2
def fn(1):
    if 1 == 1:return 1
    else:
        return fn(n-1)*n

 有序字典

orderedDict
from collections import OrderedDict
dd = OrderedDict([('a',1),('k1','v1'),('k2','abc')])
print(dd)
for k in dd:
    print(k,dd[k])
dd['k3'] = 'alex'
print(dd)

OrderedDict([('a', 1), ('k1', 'v1'), ('k2', 'abc')])
a 1
k1 v1
k2 abc
OrderedDict([('a', 1), ('k1', 'v1'), ('k2', 'abc'), ('k3', 'alex')])

  



li = [11,22,33,44,55,66,77,88,99]
my_dict = {}
for value in li:
    if value > 66:
        if 'k1' in my_dict:
            my_dict['k1'].append(value)
        else:
            my_dict['k1'] = [value]
    if value > 66:
        if 'k2' in my_dict:
            my_dict['k2'].append(value)
        else:
            my_dict['k2'] = [value]
print(my_dict)
{'k1': [77, 88, 99], 'k2': [77, 88, 99]}

  




a = list()
print(a)
[]
a = dict()
print(a)
{}

  



默认字典
from  collections import  defaultdict
d = defaultdict(list)#传入的参数是list  list()就会得到一个空列表
print(d)
d['a']
print(d)
defaultdict(<class 'list'>, {})
defaultdict(<class 'list'>, {'a': []})

  



from  collections import  defaultdict
d = defaultdict(list)#传入的参数是list  list()就会得到一个空列表
d['a']
d['alex'].append(123)
print(d)
defaultdict(<class 'list'>, {'a': [], 'alex': [123]})

  



from collections import defaultdict
li = [11,22,33,44,55,66,77,88,99]
dd = defaultdict(list)
for i in li:
    if i > 66:
        dd['k1'].append(i)
    else:
        dd['k2'].append(i)
print(dd)

  

defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99]})

  



要使得默认字典的值是 字符串那怎么办
from collections import defaultdict
func = lambda :'abc'
dd = defaultdict(func)
dd[1]
dd[2]
dd[3]
dd[4]
print(dd)

  



defaultdict(<function <lambda> at 0x0000002198502EA0>,
{1: 'abc', 2: 'abc', 3: 'abc', 4: 'abc'})

  



from collections import defaultdict
func = lambda :'abc'
dd = defaultdict(func)
dd[1] = 45
dd[2] = 'alex'
dd[3]
dd[4]
print(dd)
C:\ProgramData\Anaconda3\python.exe C:/骑士计划1期/day25/笔记代码.py

  

defaultdict(<function <lambda> at 0x0000005A0BD32EA0>,
 {1: 45, 2: 'alex', 3: 'abc', 4: 'abc'})

  



命名元组
from collections import namedtuple
birth = namedtuple('birthday',['year','month','day'])
对象名              类命名       类的静态属性
b1 = birth('2018','9','5')
print(b1)
print(b1.day)
print(b1.year)
print(b1.month)

  

 
birthday(year='2018', month='9', day='5')
5
2018
9

  



可命名元组非常类似一个只有属性没有方法的类
['year','month','day']对象的属性名
birthday 是类的名字
这个类最大的特点就是一旦实例化 就不能修改属性



queue队列
用法
put 从后端插入
get 从起前端取走
import queue #普通队列
q = queue.Queue()#队列
q.put(1)
q.put(2)
q.put(3)
q.put('abc')
q.put({'a':1})
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())

  

1
2
3
abc
{'a': 1}

  



双端队列deque[dek]
double-ended queue
用法:
右边插入 append
左边插入 appendleft
右边取走 pop
左边取走 popleft


from collections import deque
dq = deque()
dq.append('abc')
dq.append(123)
dq.append([11,2,3,5,])
dq.appendleft({1:'anc'})
dq.appendleft('ceds')
print(dq)

  

 
deque(['ceds', {1: 'anc'}, 'abc', 123, [11, 2, 3, 5]])

  



from collections import deque
dq = deque()
dq.append('abc')
dq.append(123)
dq.append([11,2,3,5,])
dq.appendleft({1:'anc'})
dq.appendleft('ceds')
print(dq)
print(dq.pop())
print(dq.popleft())

  



deque(['ceds', {1: 'anc'}, 'abc', 123, [11, 2, 3, 5]])
[11, 2, 3, 5]
ceds

  


deque(['ceds', {1: 'anc'}, 'abc', 123, [11, 2, 3, 5]])
deque(['ceds', {1: 'anc'}, 'alex', 'abc', 123, [11, 2, 3, 5]])

  

 
from collections import deque
dq = deque()
dq.append('abc')
dq.append(123)
dq.append([11,2,3,5,])
dq.appendleft({1:'anc'})
dq.appendleft('ceds')
print(dq)
dq.insert(2,'alex')
print(dq)

  




队列 以及双向队列的插入效率很高

猜你喜欢

转载自www.cnblogs.com/cavalier-chen/p/9595280.html