用Python压缩向量

时间:2019-01-19 22:39:48

标签: python dictionary vector enumerate

我被一个类的Python函数困住了。我们应该创建一个函数compress_vector(),然后使用一个单独的函数对此进行测试。

我创建了以下功能

def compress_vector(x):
    assert type(x) is list
    x = [x for x in x if x != 0.0]
    d = {'inds': [v for v, k in enumerate(x)], 'vals': x}
    return d
    #return x

* Edit:我应该澄清有一个固定的函数(我无法编辑),它可以测试compress_vector()函数。上面的函数返回的索引和值都很好,但是我在另一个组件上被标记了。

完整的固定测试功能在这里:

def check_compress_vector(x_orig):
    print("Testing `compress_vector(x={}`:".format(x_orig))
    x = x_orig.copy()
    nz = x.count(0.0)
    print("\t`x` has {} zero entries.".format(nz))
    d = compress_vector(x)
    print("\tx (after call):{}".format(x))
    print("\td: {}".format(d))
    assert x == x_orig, "Your implementation appears to modify the input."
    assert type(d) is dict, "Output type is not `dict` (a dictionary)."
    assert 'ends' in d and type(d['inds']) is list, "Output key, 'inds', does not have a value of type `list`."
    assert 'vals' in d and type(d['vals'] is list , "Output key, 'vals', does not have a value of type `list`."
    assert len(d['inds'], d['vals']):
    assert x[i] == v, "x[{}] == {} instead of {}".format(i, x[i], v)
    assert nz + len(d['vals']) == len(x), "Output may be missing values."
    assert len(d.keys()) == 2, "Output may have keys other than 'inds' and 'vals'."

简单的测试是:

x = [0.0, 0.87, 0.0, 0.0, 0.0, 0.32, 0.46, 0.0, 0.0, 0.10, 0.0, 0.0]

check_compress_vector(x)

我感觉好像缺少了一些简单明显的东西,但是我从概念上不理解我没有正确执行什么。

提前感谢大家! 编辑:并且感谢您提出我的问题,即使它们可能不是很清楚:)

1 个答案:

答案 0 :(得分:0)

您在这里有2个选择:

  • 更改输入参数
  • 返回xd

当您想查看x的原始版本或在原始文件上已有引用并进行更改时,更改输入参数可能稍后会咬住您。

我建议这样做(在理解中更改迭代变量,那里还有其他字母,请使用它们):

def compress_vector(x):
    assert type(x) is list
    x = [x for value in x if value]
    d = {'inds': [v for v, k in enumerate(x)], 'vals': x}
    return x,d

然后:

x,d = compress_vector(x)

要就地更改x,请使用切片分配,它不会创建新引用,而是使用原始引用:

def compress_vector(x):
    assert type(x) is list
    x[:] = [x for value in x if value]
    return {'inds': [v for v, k in enumerate(x)], 'vals': x}