我尝试构建一个图形,其中顶点具有字符串标识符,并且如果2个顶点的字符串标识符仅相差一个字符则连接到另一个顶点。例如,' dog'和' dot'可以通过边缘连接。我用邻接列表维护图表。但是,在我验证了可以连接2个顶点之后,我将to_vertex对象附加到from_vertex对象的列表,反之亦然。但这导致列表包含重复的对象。以下是代码(它非常密集):
class vertex():
def __init__(self, distance = -1, edges = [], name = ''):
self.name = name
self.distance = distance
self.edges = edges
def create_graph(word_dict):
graph = []
num_words = len(word_dict)
v = [vertex(name = word_dict[x]) for x in range(num_words)]
for i in range(num_words):
for j in range(i + 1, num_words):
count = 0
if len(word_dict[i]) == len(word_dict[j]):
print word_dict[i], word_dict[j]
k = 0
is_valid = True
while k < len(word_dict[i]):
print word_dict[i][k], word_dict[j][k]
if word_dict[i][k] != word_dict[j][k]:
if count == 1:
is_valid = False
break
else:
count += 1
k += 1
else:
k += 1
if is_valid == True:
v[i].edges.append(v[j])
v[j].edges.append(v[i])
graph = [v[i] for i in range(num_words)]
return graph
if __name__ == '__main__':
graph = create_graph(['bat', 'cot', 'dog', 'dag', 'dot', 'cat'])
for v in graph:
print 'Vertex name ' + v.name
for edge in v.edges:
print edge.name
print '-----------------------------'
以下是main中for循环的输出:
Vertex name bat
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name cot
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dog
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dag
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name dot
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
Vertex name cat
cat
bat
dot
cot
cat
cot
dag
dog
dot
dog
-----------------------------
通过一些调试,我找到了
if is_valid == True:
v[i].edges.append(v[j])
v[j].edges.append(v[i])
造成了这个问题,但我无法绕过它。它不像我在第一个append语句中修改to_vertex的edge字段,但第一个append语句也影响它。
答案 0 :(得分:1)
我不完全确定,但我认为问题是使用[]
的默认值edges
,我认为它会创建一个唯一的对象[]
,然后默认初始化为那个独特的对象。所以你的所有边缘基本上都是同一个对象,当你附加到其中一个对象时,你也会附加到其他对象上。这有意义吗?
要避免此问题,请不要使用默认初始化,而是强制self.edges = []
。
或者,如果您真的想要初始化任意边缘,请尝试以下方法:
def __init__(self, distance = -1, edges = None, name = ''):
self.name = name
self.distance = distance
if edges is None:
edges = []
self.edges = edges
(如果有效,请告诉我,因为我不确定这个......)