Сжать вектор в Python - PullRequest
       12

Сжать вектор в Python

0 голосов
/ 20 января 2019

Я застрял на функции 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

* Редактировать: я должен был уточнить, что есть фиксированная функция (я не могу редактировать), которая проверяет функцию 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 голосов
/ 20 января 2019

у вас есть 2 варианта:

  • изменить входной аргумент
  • вернуть x рядом с d

Изменение входного аргумента может привести к потеревы позже, когда вы захотите проверить оригинальную версию 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}
...