为什么我不能使用方法更改 class 中列表的值?
Why can't I change the values of a list in the class using a method?
我正在尝试使用 python 实现简单的快速查找算法。这是我第一次在 Python 中使用 OOP。以下是我采取的步骤:
用 init 方法创建 class 以便它接受 N 号。列表的元素 - “id”,我将 0 - N-1 元素附加到列表中。
class QuickFindUF:
def __init__(self, N):
self.id = []
for i in range(N):
self.id.append(i)
我创建了一个接受参数的联合方法:p & q(这些是我想要连接的值),然后更改列表值,以便更改具有 pid 的列表项到 qid.
def union(self,p, q):
pid = self.id[p]
qid = self.id[q]
for i in range(len(self.id)):
if self.id[i] == pid: # This part is getting ignored, I think.
self.id[i] == qid
我创建了get_id方法来查看id的变化。
def get_id(self):
return self.id
现在在主要部分我这样做是为了查看结果:
if __name__ == "__main__":
qf = QuickFindUF(5)
print(qf.get_id())
qf.union(0, 3)
print(qf.get_id())
我应该在调用 union 方法后看到更新的 id[],但 id 没有改变。
预期输出:[0, 1, 2, 3, 4]
[3, 1, 2, 3, 4]
实际输出:[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
我尝试在 union 方法中不使用“if”语句而手动更改 id 的某些值,结果很好,例如:
id[0] = 'a'
结果很好:输出是:
[0, 1, 2, 3, 4]
['a', 1, 2, 3, 4]
那么,如果我使用带有 if 语句的 for 循环来更改列表的值,为什么联合方法不起作用?
我也试过像这样在 union() 中返回 id[]:
def union(self,p, q):
```pid = self.id[p]
qid = self.id[q]
for i in range(len(self.id)):
if self.id[i] == pid: # This part is getting ignored, I think.
self.id[i] == qid```
但是当我打印时得到相同的输出(qf.union())
试试这个
def union(self,p, q):
pid = self.id[p]
qid = self.id[q]
for i in range(len(self.id)):
if self.id[i] == pid: # This part is getting ignored, I think.
self.id[i] = qid
我建议使用 numpy:
import numpy as np
class QuickFindUF:
def __init__(self, N):
self.id = np.arange(N) # Quicker with numpy
def union(self, p, q):
pid = self.id[p]
qid = self.id[q]
# Use powerful np.where
self.id = np.where(self.id == pid, # Where self.id = pid,
qid, # changes it to qid,
self.id) # the rest of the array remains unchanged
def get_id(self):
return self.id
if __name__ == "__main__":
qf = QuickFindUF(5)
print(qf.get_id())
qf.union(0, 3)
print(qf.get_id())
如果我正确理解你的问题,它应该可以正常工作。否则调整 np.where().
的参数
祝你好运!
我正在尝试使用 python 实现简单的快速查找算法。这是我第一次在 Python 中使用 OOP。以下是我采取的步骤:
用 init 方法创建 class 以便它接受 N 号。列表的元素 - “id”,我将 0 - N-1 元素附加到列表中。
class QuickFindUF: def __init__(self, N): self.id = [] for i in range(N): self.id.append(i)
我创建了一个接受参数的联合方法:p & q(这些是我想要连接的值),然后更改列表值,以便更改具有 pid 的列表项到 qid.
def union(self,p, q): pid = self.id[p] qid = self.id[q] for i in range(len(self.id)): if self.id[i] == pid: # This part is getting ignored, I think. self.id[i] == qid
我创建了get_id方法来查看id的变化。
def get_id(self): return self.id
现在在主要部分我这样做是为了查看结果:
if __name__ == "__main__":
qf = QuickFindUF(5) print(qf.get_id()) qf.union(0, 3) print(qf.get_id())
我应该在调用 union 方法后看到更新的 id[],但 id 没有改变。
预期输出:[0, 1, 2, 3, 4]
[3, 1, 2, 3, 4]
实际输出:[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
我尝试在 union 方法中不使用“if”语句而手动更改 id 的某些值,结果很好,例如:
id[0] = 'a'
结果很好:输出是:
[0, 1, 2, 3, 4]
['a', 1, 2, 3, 4]
那么,如果我使用带有 if 语句的 for 循环来更改列表的值,为什么联合方法不起作用?
我也试过像这样在 union() 中返回 id[]:
def union(self,p, q):
```pid = self.id[p]
qid = self.id[q]
for i in range(len(self.id)):
if self.id[i] == pid: # This part is getting ignored, I think.
self.id[i] == qid```
但是当我打印时得到相同的输出(qf.union())
试试这个
def union(self,p, q):
pid = self.id[p]
qid = self.id[q]
for i in range(len(self.id)):
if self.id[i] == pid: # This part is getting ignored, I think.
self.id[i] = qid
我建议使用 numpy:
import numpy as np
class QuickFindUF:
def __init__(self, N):
self.id = np.arange(N) # Quicker with numpy
def union(self, p, q):
pid = self.id[p]
qid = self.id[q]
# Use powerful np.where
self.id = np.where(self.id == pid, # Where self.id = pid,
qid, # changes it to qid,
self.id) # the rest of the array remains unchanged
def get_id(self):
return self.id
if __name__ == "__main__":
qf = QuickFindUF(5)
print(qf.get_id())
qf.union(0, 3)
print(qf.get_id())
如果我正确理解你的问题,它应该可以正常工作。否则调整 np.where().
的参数祝你好运!