2010-04-16 1 views
2

Поскольку я довольно новый, этот вопрос, безусловно, звучит глупо, но я понятия не имею, как подойти к этому.Двойной связующий массив в Python

Я пытаюсь взять список узлов, и для каждого из узлов я хочу создать массив предшественников и преемников в упорядоченном массиве всех узлов.

В настоящее время мой код выглядит следующим образом:

nodes = self.peers.keys() 
    nodes.sort() 

    peers = {} 
    numPeers = len(nodes) 
    for i in nodes: 
     peers[i] = [self.coordinator] 
    for i in range(0,len(nodes)): 
     peers[nodes[i%numPeers]].append(nodes[(i+1)%numPeers]) 
     peers[nodes[(i+1)%numPeers]].append(nodes[i%numPeers]) 
#  peers[nodes[i%numPeers]].append(nodes[(i+4)%numPeers]) 
#  peers[nodes[(i+4)%numPeers]].append(nodes[i%numPeers]) 

Последние две строки позже должны быть использованы для создания пропускаемого графа, но это не очень важно. Проблема в том, что она действительно не работает надежно, иногда пропущен предшественник или преемник, а вместо этого используется следующий и т. Д. Это правильно или есть лучший способ сделать это? В основном мне нужно получить индексы массива с определенными смещениями друг от друга.

Любые идеи?

+0

Это кажется правильным, на первый взгляд. Не могли бы вы расширить ситуацию, когда происходит пропуски? Возможно, вы меняете размер узлов и не обновляете numPeers? – rbp

+0

Ну, этого не происходит, так как я работаю над копией ключей словаря, а не непосредственно на массиве узлов. Я начинаю задаваться вопросом, имеет ли он какое-либо отношение к тому, как я обнаруживаю ребра на графике. В качестве примера следующие результаты наложения: http://bit.ly/bpVPVM с правой стороны, мы имеем ситуацию a -> c, b -> c, c -> b и b -> a, тогда как a -> c край неверно, и должно быть a-> b – cdecker

ответ

2

Я бы почти поспорил, что при возникновении ошибки значения в узлах имеют дубликаты, что приведет к смешению вашего словаря в сверстниках. Ваш код предполагает, что значения в узлах уникальны.

+0

Хорошо, я запустил его через фильтр. – cdecker

+0

Кажется хорошо работать. Странно, я всегда думал, что ключи вернут список без дубликатов. Я проверю его с помощью графика пропуска и посмотрю, работает ли это тоже :-) – cdecker

+1

Будет. Вы не можете дублировать ключи в словаре. –