我有一個節點的無向??圓形圖,該圖由一個Graph類組成,節點由一個Node類組成。每個節點都有一些屬性,其中之一就是pos屬性。在 Graph 類中,我初始化了graph一個 defaultdict 屬性。意味著具有 Node 類的graph節點,每個節點都指向它的下一個和上一個節點,基于pos. 如果節點為 1,則其前一個節點是最后一個節點(讓我們認為它的pos值為 20),反之亦然。現在我已經將每個鍵的graph值設定為None,但我想將該值設定為鄰居,以指示邊緣。這是我到目前為止所做的:
class Graph:
def __init__(self) -> None:
self.graph=defaultdict(Node)
for i in range(1,21):
self.graph[Node(i, False, False, False)]=None
def edge_gen(self):
for node in self.graph.keys():
if node.pos==1:
x=node
continue
if node.pos==50:
self.graph[node.pos].add(x)
self.graph[x].add(node.pos)
prev_node=self.graph.keys()[node.pos-1] # Here is where I am lost
print(prev_node, node)
self.graph[node.pos].add(prev_node)
self.graph[prev_node].add(node.pos)
return self.graph
如評論所示,在那一步,我不明白如何獲取當前節點的鄰居節點的物件pos。我首先嘗試設定prev_node為,node.pos-1但我知道那行不通。我將 的鍵graph放在一個回圈中,對于每個節點,我想將其前一個節點添加為一個值,對于前一個節點和當前節點也是如此。有人可以幫我理解如何讓這個回圈中的前一個節點形成邊,從而創建一個圓形無向圖嗎?謝謝閱讀。
uj5u.com熱心網友回復:
如何在 Python 中基于其屬性參考特定物件,而它處于回圈中?
如果回圈中的物件是由迭代器傳遞的,那么您在回圈代碼塊中只能訪問這個物件。因此,上述問題的答案是:在回圈傳遞迭代器的物件時,您不能根據其屬性參考特定物件。
回答了這個問題后,我對您提供的代碼實際想要實作的最佳猜測如下:
class Node:
def __init__(self, pos, v1, v2, v3):
self.pos = pos
self.v1 = v1
self.v2 = v2
self.v3 = v3
class Graph:
def __init__(self, noOfNodes) -> None:
assert noOfNodes > 2
self.graph = {}
self.graph[1] = [
Node(noOfNodes , False, False, False),
Node( 2 , False, False, False), ]
for i in range(2, noOfNodes):
self.graph[i] = [
Node( i-1, False, False, False),
Node( i 1, False, False, False), ]
self.graph[noOfNodes] = [
Node(noOfNodes-1, False, False, False),
Node( 1 , False, False, False), ]
def edge_gen(self):
return self.graph
g = Graph(3)
print(g.edge_gen())
或者
class Node:
def __init__(self, pos, v1, v2, v3):
self.pos = pos
self.v1 = v1
self.v2 = v2
self.v3 = v3
class Graph:
def __init__(self, noOfNodes) -> None:
assert noOfNodes > 2
self.noOfNodes = noOfNodes
self.listOfNodes = [None] # index 0 won't be used
for i in range(1, noOfNodes 1):
self.listOfNodes.append(Node(i , False, False, False))
self.graph = dict(zip(self.listOfNodes[1:], [None]*noOfNodes))
def edge_gen(self):
self.graph[self.listOfNodes[1]] = [
self.listOfNodes[self.noOfNodes],
self.listOfNodes[ 2 ] ]
for i in range(2, self.noOfNodes):
self.graph[self.listOfNodes[i]] = [
self.listOfNodes[i-1],
self.listOfNodes[i 1] ]
self.graph[self.listOfNodes[self.noOfNodes]] = [
self.listOfNodes[self.noOfNodes-1],
self.listOfNodes[ 1 ] ]
return self.graph
g = Graph(3)
print(g.graph)
print(g.edge_gen())
希望這有助于您擺脫在錯誤方向上尋找解決方案的死胡同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520877.html
