Я пытаюсь закодировать вариант алгоритма кратчайшего пути Дейкстры. При этом я хочу инициализировать кратчайшие расстояния пути до math.inf и вернуть это значение для любого невидимого ключа.
Я использую defaultdict, инициализированный как defaultdict(lambda:math.inf), в надежде, что для нового ключа будет возвращено бесконечное значение.
Однако в приведенном ниже примере я вижу, что значения None возвращаются.
Инициализация:
shortest_paths = defaultdict(lambda:math.inf)
shortest_paths[k] = 0
print(f"Initial values for shortest_paths = {shortest_paths}")
Это печатает:
Initial values for shortest_paths = defaultdict(<function Solution.networkDelayTime.<locals>.<lambda> at 0x1044818b0>, {2: 0})
Вызов:
print(f"n = {n} and shortest_paths.get(n) = {shortest_paths.get(n)}")
Это печатает:
n=1 and shortest_paths.get(n) = None
В конечном итоге это приводит к сравнению между объектом None и целочисленным значением, что нарушает мой код.
shortest_paths[n] = min(shortest_paths.get(n), shortest_paths.get(current) + dist)
Ведущий к:
TypeError: '<' not supported between instances of 'int' and 'NoneType'
Я пытаюсь понять, как значение defaultdict не инициализируется.
Этот точный код, вставленный в REPL, работает нормально. Я использую VSCode, если это актуально.
Спасибо, это сработало! Пожалуйста, не стесняйтесь отвечать на вопрос с этим комментарием, поэтому я могу принять его.





смысл defaultdict в том, что вы всегда используете доступ в квадратных скобках -- .get(...) сохраняет свою первоначальную семантику (унаследованную от dict):
>>> shortest_paths = defaultdict(lambda:math.inf)
>>> shortest_paths[5]
inf
>>> shortest_paths.get(5)
inf
>>> print(shortest_paths.get(6))
None
смысл
defaultdictв том, что вы всегда используете доступ в квадратных скобках --.getсохраняет свою первоначальную семантику