class SparseVec:

  def __init__(self, vals={}):

	self.val = {}
	self.val.update(vals)
	self.len=max([0]+vals.keys())

  def __len__(self): 
	return self.len

  def __getitem__(self,i):
	return self.val.get(i,0.0)

  def __setitem__(self,i,n):
	self.val[i]=n
	self.len=max(i,self.len)

  def __add__(self,other):
	result=SparseVec()
	for i in self.val: 
		result[i] = self[i]+other[i]
	for j in other.val:
		if j not in self.val:
			result[j]=other[j]
	return result

  def __str__(self):
	s="["
	if self.len>0:
		for i in range(self.len+1):
			s+=str(self[i])
			if i < self.len:
				s+=", "
	s+="]"
	return s

  def __delitem__(self,i):
	del self.val[i]
	if (i==self.len):
		self.len=i-1


if __name__=="__main__":
	x=SparseVec ({1:0.1, 3:0.3})
	y=SparseVec({1:1.0, 2:2.0, 4:4.0})
	print "x:", x
	print "len(x):", len(x)
	print "y:",y
	print "x+y:", x+y
	x[2]=0.2
	print "x is now:", x
	print "y+x", y+x
	del x[1]
	print "x:",x

