2014-07-25 70 views
0

everyone。我在Python 2.7中使用Networkx 1.9 Module编写了一个简单函数,用于测试我的图分区算法实现是否正常工作。为此,我有一个列表dvecs,它列出了列表分区中的每个块,这些列表提供了有关从每个节点到分区中的类的边缘的信息。采取甘德:遍历并更改Python中的嵌套列表条目

#dvecs : list of len(P) lists which correspond to a list of degree vectors of each block 
    numBlocks = len(P) 
    dvecs = [[]] * numBlocks 

    for block in P: 
     blockNo = P.index(block) 
     dvecs[blockNo] = [[-1] * numBlocks] * len(block) 
     for node in block: 
      nodeNo = block.index(node) 
      for otherBlock in P: 
       otherBlockNo = P.index(otherBlock) 
       dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G, node)).intersection(set(otherBlock))) 

我遇到的问题是,在嵌套循环,与dvec [块编号...]开始,根据调试器行,每个条目的最后一行在中间深度列表(具有由nodeNo指定的索引的那个列表)中,对于最内层循环的每次迭代正在使用相同的值进行更新。换句话说,就好像“节点”保持不变并且nodeNo通过块中的所有节点迭代。这里发生了什么?

针对罗马,我试过如下:

for blockNo, block in enumerate(P): 
     dvecs[blockNo] = [[-1] * numBlocks] * len(block) 
     for nodeNo, node in enumerate(block): 
      for otherBlockNo, otherBlock in enumerate(P): 
       dvecs[blockNo][nodeNo][otherBlockNo] = len(set(nx.neighbors(G, node)).intersection(set(otherBlock))) 

我,然而,得到了相同的行为。我错过了什么?

+0

注意使用枚举,而不是前的越来越指数:HTTP://stackoverflow.com/questions/1185545/python-loop-counter-in -a-for-loop –

+0

感谢罗马人的快速响应。我对python非常陌生,所以直到现在我还没有听说过。 –

+0

如果您是新手,您可能还想阅读有关清理文件/其他资源的声明:http://stackoverflow.com/questions/3012488/what-is-the-python-with-statement-designed-for –

回答

1

此:

[[]] * n 

为您提供了包含相同空单,n时间的列表。所以追加到它们中的任何一个附加到它们的“全部” - 只有一个嵌套列表。

试试这个,这将创造n不同的空列表:

[[] for _ in range(n)] 
+0

感谢您的提示。我改变了这一点,但我得到同样的问题。 –

+0

你必须在第一个循环内进行相同的修复,在这里你指定'dvecs [blockNo]'。可能更简单的方法是使用'.append([])'而不是提前构建完整的垃圾数值列表 – Eevee

+0

谢谢。它现在有效。 –