Как выполнить индексирование, не вызывая 'IndexError: недопустимый индекс для скалярной переменной.' ошибка - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь найти максимальное значение (я) в словаре, и мой подход состоит в том, чтобы перебирать и проверять наибольшие значения и составлять список пары наибольшее значение / ключ и всего, что эквивалентно ему, из словаря и У меня есть следующее ...

def foo(class_sum, input_object):  # Predicts the class x is a member of given probability dictionary
    probabilities = calc_class_probs(class_sum, input_object)  # Returns a dictionary with probability elements
    best_label, best_perc = list(), list()
    best_perc.append(-1)
    print(best_perc[0])
    for val in probabilities:
        print(probabilities[val])
        if probabilities[val] > best_perc[0]:
            del best_label
            del best_perc  # Empty list in case unwanted elements are present
            best_label, best_perc = val, probabilities[val]  # update with new best
        elif probabilities[val] == best_perc:
            best_label.append(val)
            best_perc.append(probabilities[val])

    return best_label, best_perc

Итак, я ожидаю, что if probabilities[val] > best_perc[0]: будет оцениваться до 7.591391076586993e-36 > -1, по крайней мере, для первой итерации. Однако я получаю следующий вывод из операторов print ...

-1
7.591391076586993e-36

РЕДАКТИРОВАТЬ: кажется, что на второй итерации происходит сбой, это может быть из-за операторов del?

0 7.591391076586993e-36
1 7.297754873023128e-36
...
IndexError: invalid index to scalar variable.

и эта ошибка ...

if probabilities[val] > best_perc[0]:
IndexError: invalid index to scalar variable.

Почему он может печатать значения, а не индексировать их здесь? Обратите внимание: probabilities - это словарь с ключами, которые имеют одинаковые значения вероятности, как показано ниже.

{'0': 7.59139e-36, '1': 7.2977e-36,...}

1 Ответ

2 голосов
/ 05 мая 2019

Я считаю, что ваша проблема здесь:

best_label, best_perc = val, probabilities[val]

После выполнения первых 'if' best_lavel и best_perc больше нет списка, поэтому вы не можете получить доступ к best_perc[0].

Вы можете заменить его на

best_label, best_perc = [val], [probabilities[val]]

Обратите внимание, что при выполнении итераций в словаре вы выполняете итерации по ключам, а не по значениям.Вы можете выполнять итерации по ключам и значениям:

for key, val in dictionary.items():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...