这周的作业还比较少,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