2014-07-25 3 views
0

все. Я пишу простую функцию в Python 2.7 с помощью модуля Networkx 1.9 для тестирования того, что моя реализация алгоритма разбиения графов работает правильно. С этой целью у меня есть список 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 [blockNo ...], в соответствии с отладчиком, каждый из записей в списке средней глубины (с индексами, указанными 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

Спасибо. Он работает сейчас. –

Смежные вопросы