这周的作业还比较少,Python的语言确实比较精简,所以如果代码写的优雅的话,代码量可是很少的哦!
基本上用Comprehension就可以完成了,因为vec.py实现了Vec的加法和乘法,所以可以使用sum函数计算Vec的和,注意Problem2里面的乘法是没有实现交换律的,所以a*Vec成立而Vec*a是会报错的,我就是这个卡了好久。Problem3里面利用了Python库 import itertools然后计算L的组合,之后再将每一个排列组合加起来,因为计算出来的list会有成员的冗余和多一个0所以删除掉第一个0元素,取而代之的是Vec(D,{})空向量,再加一个全部元素的排列组合的和就好了。
代码如下:
# version code 761 # Please fill out this stencil and submit using the provided submission script. from vec import Vec from vec import * import itertools ## Problem 1 def vec_select(veclist, k): ''' >>> D = {'a','b','c'} >>> v1 = Vec(D, {'a': 1}) >>> v2 = Vec(D, {'a': 0, 'b': 1}) >>> v3 = Vec(D, { 'b': 2}) >>> v4 = Vec(D, {'a': 10, 'b': 10}) >>> vec_select([v1, v2, v3, v4], 'a') == [Vec(D,{'b': 1}), Vec(D,{'b': 2})] True ''' return [x for x in veclist if x[k]==0] def vec_sum(veclist, D): ''' >>> D = {'a','b','c'} >>> v1 = Vec(D, {'a': 1}) >>> v2 = Vec(D, {'a': 0, 'b': 1}) >>> v3 = Vec(D, { 'b': 2}) >>> v4 = Vec(D, {'a': 10, 'b': 10}) >>> vec_sum([v1, v2, v3, v4], D) == Vec(D, {'b': 13, 'a': 11}) True ''' return Vec(D,{k:sum([x[k] for x in veclist]) for k in D}) def vec_select_sum(veclist, k, D): ''' >>> D = {'a','b','c'} >>> v1 = Vec(D, {'a': 1}) >>> v2 = Vec(D, {'a': 0, 'b': 1}) >>> v3 = Vec(D, { 'b': 2}) >>> v4 = Vec(D, {'a': 10, 'b': 10}) >>> vec_select_sum([v1, v2, v3, v4], 'a', D) == Vec(D, {'b': 3}) True ''' return vec_sum(vec_select(veclist,k),D) ## Problem 2 def scale_vecs(vecdict): ''' >>> v1 = Vec({1,2,3}, {2: 9}) >>> v2 = Vec({1,2,4}, {1: 1, 2: 2, 4: 8}) >>> scale_vecs({3: v1, 5: v2}) == [Vec({1,2,3},{2: 3.0}), Vec({1,2,4},{1: 0.2, 2: 0.4, 4: 1.6})] True ''' #return [k*v for (k,v) in vecdict] return [(1/k)*vecdict[k] for k in vecdict] ## Problem 3 def GF2_span(D, L): ''' >>> from GF2 import one >>> D = {'a', 'b', 'c'} >>> L = [Vec(D, {'a': one, 'c': one}), Vec(D, {'b': one})] >>> len(GF2_span(D, L)) 4 >>> Vec(D, {}) in GF2_span(D, L) True >>> Vec(D, {'b': one}) in GF2_span(D, L) True >>> Vec(D, {'a':one, 'c':one}) in GF2_span(D, L) True >>> Vec(D, {x:one for x in D}) in GF2_span(D, L) True ''' vecp=[] if len(L)==0:return Vec(D,{}) for i in range(len(L)): vecp.append(itertools.permutations(L,i)) #vecp.remove(vecp[0]) #vecp.append(Vec(D,{})) vecp=[sum(x) for y in vecp for x in y] vecp.remove(vecp[0]) vecp.append(Vec(D,{})) vecp.append(sum(L)) return vecp ## Problem 4 # Answer with a boolean, please. is_it_a_vector_space_1 = True is_it_a_vector_space_2 = False ## Problem 5 is_it_a_vector_space_3 = True is_it_a_vector_space_4 = False ## Problem 6 is_it_a_vector_space_5 = True is_it_a_vector_space_6 = False