我在解决这段代码中的TypeError时遇到问题。它一直说“TypeError:list indices必须是整数,而不是str”,有趣的是我在代码中没有列表。我“已经”列出了一个列表,但后来改为dict。带错误的行是:
if (link_params.get('bandwidth', 99999) < dist['bandwidth']):
我试过在解释器中解决这个问题,它在那里工作得很好。没有任何问题。
for neighbor, edges in active_graph[curnode].items():
# We create a hack here for astar since it is not implemented for
# multigraphs. If a node has multiple edges to its neighbor,
# we always pick the first edge in the edge dict. This may cause
# unexpected behavior because we are using an unordered dict and the
# first value may not be the same all the time. Also, in a multigraph,
# the adjacency list to every neighbor is a dict itself, keyed with the
# edge identifier. In the case of a single edge, the edge identifier is 0.
if neighbor in explored:
continue
link_params = dict(edges[0])
if (link_params.get('bandwidth', 99999) < dist['bandwidth']):
ncost['bandwidth'] = link_params['bandwidth']
else:
ncost['bandwidth'] = dist['bandwidth']
ncost['latency'] = dist['latency'] + link_params['latency']
ncost['cost'] = dist['cost'] + link_params['cost’]
active_graph [node] .items()返回键和值的迭代器。我这里有一个三重嵌套的词典。
第一级 - 邻接词。
第二级 - 边缘词典。
第三级 - 边缘属性字典。
基本原理是第一级保持相邻节点的轨迹(由相邻节点id键控,第二级存储边缘,第三级存储边缘属性。这是为了辅助多图场景。
例如,G [1]将给出节点1的邻接列表,让我们说:
{2: {0: {‘a’: 1, ‘b’: 2, ‘c’:3}, 1: {‘d’: 4, ‘e’: 5, ‘f’:6}}}
G [1] [2]会给我们
{0: {‘a’: 1, ‘b’: 2, ‘c’:3}, 1: {‘d’: 4, ‘e’: 5, ‘f’:6}}
最后,G [1] [2] [0]将给我们
{‘a’: 1, ‘b’: 2, ‘c’:3}
我可以查询任何内容,例如G [1] [2] [0] .get('a',99)。这就是我目前正在做的并获得TypeError。有人可以指出我在这里失踪了吗?
编辑:
回溯
文件“/src/controlplane/algorithms/astar.py”,第96行,在astar_path中
if (link_params.get('bandwidth', 99999) < dist['bandwidth']):
TypeError: list indices must be integers, not str
不,dist不是列表。这是一个词典。
ncost = {}
qcost = {}
dist = {}
default_dict_keys = ['bandwidth', 'latency', 'cost']
for key in default_dict_keys:
if key == 'bandwidth':
dist.setdefault(key, 99999)
else:
dist.setdefault(key, 0)
ncost.setdefault(key, 0)
qcost.setdefault(key, 0)