TypeError表示列表错误,但代码中没有列表

时间:2014-02-25 07:37:51

标签: python-3.x graph typeerror

我在解决这段代码中的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。有人可以指出我在这里失踪了吗?

编辑:

  1. 回溯

    文件“/src/controlplane/algorithms/astar.py”,第96行,在astar_path中

    if (link_params.get('bandwidth', 99999) < dist['bandwidth']):
    TypeError: list indices must be integers, not str
    
  2. 不,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)
    

0 个答案:

没有答案