簡體   English   中英

為什么我不能使用方法更改 class 中列表的值?

[英]Why can't I change the values of a list in the class using a method?

我正在嘗試使用 python 實現簡單的快速查找算法。 這是我第一次在 Python 中使用 OOP。 以下是我采取的步驟:

  1. 使用 init 方法創建 class 以便它接受 N 號。 列表的元素 - “id”,我 append 列表中的 0 - N-1 個元素。

     class QuickFindUF: def __init__(self, N): self.id = [] for i in range(N): self.id.append(i)
  2. 我創建了一個接受 arguments 的聯合方法: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
  3. 我創建 get_id 方法來查看 id 的變化。

     def get_id(self): return self.id
  4. 現在在主要部分中,我這樣做是為了查看結果:

    if __name__ == "__main__":

     qf = QuickFindUF(5) print(qf.get_id()) qf.union(0, 3) print(qf.get_id())

調用 union 方法后,我應該會看到更新的 id[] ,但 id 不會改變。
預期 output: [0, 1, 2, 3, 4] [3, 1, 2, 3, 4]
實際 output: [0, 1, 2, 3, 4] [0, 1, 2, 3, 4]

我嘗試在不使用聯合方法中的“if”語句的情況下手動更改 id 的一些值,結果很好,例如: id[0] = 'a' ,結果很好:output 是: [0, 1, 2, 3, 4] ['a', 1, 2, 3, 4]

那么,如果我使用帶有 if 語句的 for 循環來更改列表的值,為什么 union 方法不起作用?

我還嘗試在 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```

但是當我打印時我得到相同的 output(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() 的參數。

祝你好運 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM