我是 Python 新手。
我试着做一个 Kruskal 算法。这是我的代码:
#c={('v','a'):5,('v','g'):5,('g','a'):5,('v','b'):7,('v','e'):4,('f','e'):8,('f','b'):8,('f','c'):11,('c','e'):9,('c','d'):7,('c','b'):9,('e','d'):8}
#n=8
def argmin(c):
m=1e100
r=()
for i in c:
if c[i]<m:
m=c[i]
r=i
return r
def kruskal (n, c):
T=[]
B=[]
while len(T)<n-1:
E=argmin(c)
c.pop(E)
e=[]
e+=E
a0=0
a1=0
f0=-1
f1=-1
cross=0
# print('e avant',e)
for i in range(len(B)):
for j in range(len(B[i])):
if e[0]==B[i][j]:
cross+=1
f0=i
if e[1]==B[i][j]:
cross+=1
f1=i
if cross==2: break
else: cross=0
if cross==2: continue
# print('e apres',e)
T.append(e)
# print('T',T)
if f0!=-1 and f1!=-1:
B[f0].extend(B[f1])
B.pop(f1)
elif f0!=-1:
B[f0].extend(e[1])
elif f1!=-1:
B[f1].extend(e[0])
else :
B.append(e)
# print('B', B)
return T
我遇到的问题是在行中:“T.append(e)” 结果 T[0] 不是我所期望的。 如果我输入以下内容:
c={('v','a'):5,('v','g'):5,('g','a'):5,('v','b'):7,('v','e'):4,('f','e'):8,('f','b'):8,('f','c'):11,('c','e'):9,('c','d'):7,('c','b'):9,('e','d'):8}
n=8
然后我调用我的函数: 克鲁斯卡尔 (8, c) 我得到:
[['v', 'e', 'g', 'a', 'b', 'f', 'c', 'd'], ['v', 'g'] , ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd'] ]
如我所料:
[['v', 'e'], ['v', 'g'], ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd']]
最佳答案
不是在寻找你所有的代码。但是发现了一些东西,你有时会附加 list
的 references
。所以简单地修复:
from copy import deepcopy
T.append(deepcopy(e)) #in place of T.append(e)
将输出为
[['v', 'e'], ['g', 'a'], ['v', 'a'], ['v', 'b'], ['c', 'd'], ['f', 'b'], ['e', 'd']]
示例
a = [1, 2]
b = a
b.append(3)
>>>a
[1,2,3]
>>>b
[1,2,3]
这里发生了什么
a = [1,2]
b = a
>>>id(a), id(b)
(140526873334272, 140526873334272)
列表 [1,2]
由两个变量 a
和 b
标记
。因此,对列表的任何更改都会影响标记到它的每个 varables
。
关于Python:列表追加函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29250114/