Python入门之collections模块
Python入门之collections模块
第1关:命名元组 (namedtuple)
·任务描述
本关任务:补充函数代码,完成对命名元组的简单操作。
·命名元组 (namedtuple)
Python中提供了基础的不可变数据结构元组tuple,对元组元素的访问需通过索引来完成,对此需要熟记每个下标对应的具体含义。如果元素数量一多,要记清楚这些东西就会比较麻烦了,于是就出现了命名元组namedtuple。
·测试说明
正确的补充代码后应该得到的结果:
当前位置:x = 0,y = 0
当前位置:x = 1,y = 0
当前位置:x = 1,y = 1
import collections
def CreatePoint():
#创建并返回一个命名元组实例,有属性x,y,初值都为0
point = collections.namedtuple('point','x,y')
p = point(x = 0,y = 0)
return p
def IncX(p):
#对变量p的x坐标进行+1操作,然后返回修改过后的新对象
p = p._replace(x=1)
return p
def IncY(p):
#对参数p的y坐标进行+1操作,然后返回修改过后的新对象
p = p._replace(y=1)
return p
def PrintPoint(p):
#按照:"当前位置:x = XXX,y = XXX" 的格式打印参数p
print('当前位置:x = %d,y = %d'%(p.x,p.y))
第2关:计数器 (Counter)
·任务描述
本关任务:编写一个对输入字符串的字符进行计数的程序。
计数器(Counter)
计数器是一个无序容器,用于记录各种值出现的次数。它采用键值对的形式存储,要记录的值作为key,这个值出现的次数作为value,value值可正可负。
#创建计数器
要创建一个计数器实例,可以调用它的无参构造函数:
c = collections.Counter()
这样就创建了一个空的计数器实例c。
·测试输入:
aabbc
aabbc
aabbc
aabbc
aabbc
aabbc
预期输出:
[(‘a’, 0), (‘b’, 0), (‘c’, 0)]
测试输入:
a
b
a
b
a
b
预期输出:
[(‘a’, 3), (‘b’, -3)]
import collections
def Func():
c = collections.Counter()
for i in range(1,7):
sb = input()
if(i%2!=0):
c.update(sb)
else :
c.subtract(sb)
print(c.most_common())
第3关:双向队列 (deque)
·任务描述
本关任务:编写一个能输出“震荡”队列的程序。
双向队列 (deque)
双向队列是一种能在队列两端都进行入队出队操作的数据结构,比普通的队列更加灵活也更加复杂。
创建双向队列
就像计数器Counter,双向队列可以调用无参构造函数创建一个空队列,也可以使用可迭代对象创建并初始化一个队列,比如:
d = collections.deque() #创建一个空队列
d = collections.deque([‘a’,‘b’,‘c’]) #从list创建
d = collections.deque((‘a’,‘b’,‘c’)) #从tuple创建
d = collections.deque({‘a’:0,‘b’:1,‘c’:2}) #从dict创建
d = collections.deque(“abc”) #从字符串创建
第一行语句创建一个空队列,下面四行语句创建了含有元素a,b,c的队列,要注意当从dict创建时,使用的是它的键key,而不是值value。
·编程要求
根据提示,补充右侧编辑器代码完成函数功能,函数读取输入的一个数字n(n≥0),然后输出一个有n个元素,元素从0到n-1的“震荡”的队列,“震荡”的定义见测试说明。
·测试说明
当输入:3时,输出的“震荡”队列应该是:
deque([1, 0, 2])
当输入:5时,输出的“震荡”队列应该是:
deque([3, 1, 0, 2, 4])
import collections
def Func():
d = collections.deque()
x = int(input())
for i in range(x):
if(i%2==0):
d.append(i)
else:
d.appendleft(i)
print(d)
第4关:有序字典 (OrderedDict)
·任务描述
本关任务:读取数据创建n个键值对,将其排序后放入有序字典并输出。
有序字典 (OrderedDict)
有序字典和普通的dict基本上是相似的,只有一点不同,那就是有序字典中键值对的顺序会保留插入时的顺序。
·编程要求
根据提示,在右侧编辑器补充代码,实现函数功能:读取n(n>0)行输入,以每一行的数据为key,行号(从0开始)为value,建立n对键值对,然后将他们按照key排序后,放入一个有序字典,最后输出这个有序字典。
·测试输入:
3
a
c
b
预期输出:
OrderedDict([(‘a’, 0), (‘b’, 2), (‘c’, 1)])
测试输入:
4
A
B
D
C
预期输出:
OrderedDict([(‘A’, 0), (‘B’, 1), (‘C’, 3), (‘D’, 2)])
import collections
def Func():
n = int(input())
data = {}
if(n>=0):
for i in range(n):
x = input()
data[x] = i
od = collections.OrderedDict(sorted(data.items(),key=lambda s:s[0]))
print(od)
第5关:默认字典 (defaultdict)
·任务描述
本关任务:补充函数代码,创建不同类型的默认字典。
默认字典 (defaultdict)
默认字典的功能与dict基本相同,但在访问一个不存在的key时,默认字典会提供一个默认值,而不是引发异常。
##创建默认字典
默认字典的构造函数接受一个工厂函数default_factory作为参数,可以将一个类型名看做是一个工厂函数,比如list,tuple,str等。
·编程要求
根据右边编辑器中各个函数中的提示,将函数补充完整,使得程序能够正常运行并输出正确的结果。
右侧编辑器的4个函数会被依次调用,并产生4个默认字典,并会以类似如下的方式,获取并输出默认值:
dd = GetIntDefaultDict()
print(“int默认字典的默认值:”,dd[‘a’])
·测试说明
正确的补充代码后应该得到的结果:
int默认字典的默认值: 0
list默认字典的默认值: []
tuple默认字典的默认值: ()
str默认字典的默认值:
import collections
def GetIntDefaultDict():
dd = collections.defaultdict(int)
return dd
def GetListDefaultDict():
dd = collections.defaultdict(list)
return dd
def GetTupleDefaultDict():
dd = collections.defaultdict(tuple)
return dd
def GetStrDefaultDict():
dd = collections.defaultdict(str)
return dd
······通关成功······
如有问题,敬请斧正。