1

以下のコードをインタープリターで実行し、ユニオン関数を呼び出しました

quick_find(10).union(3,4)

出力:[0, 1, 2, 4, 4, 5, 6, 7, 8, 9]

quick_find(10).union(0,4)

出力:[4, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ユニオン関数を 2 回目に呼び出すと、出力リストは this になります
[4, 1, 2, 4, 4, 5, 6, 7, 8, 9]

しかし、代わりに出力として私に与えて[4, 1, 2, 3, 4, 5, 6, 7, 8, 9]います。どうすれば目的の出力を取得できますか。提案してください

class quick_find:

    def __init__(self,n):
        self.id = [number for number in xrange(n)]


    def union(self,x,y):
        j = 0
        elements = self.id
        for i in elements:
            if i == elements[x]:
                elements[j] = elements[y]
            j = j+1

        self.id = elements
        return elements 
4

2 に答える 2

1

実際にはunion()、毎回新しいインスタンスでそのメソッドを呼び出しています。

コードの改良版:

class Quick_find:
    def __init__(self,n):
        self.id = range(n)    #just range() is enough

    def union(self,x,y):
        for i,elem in enumerate(self.id):    #use enumerate() for indexes
            if elem==x:
                self.id[i]=y

    def show(self):
        print self.id

q=Quick_find(10)       #create a instance
q.union(3,4)           #call union on that instance
q.union(0,4)           #call union on that instance
q.show()               

出力:

[4, 1, 2, 4, 4, 5, 6, 7, 8, 9]
于 2013-03-31T11:53:22.507 に答える
0

「プレースホルダー」オブジェクト/変数に割り当てないことで、要求しているリストの新しいインスタンスを作成しています。このようにすると、リストをそのまま維持できます。

myInstance = quick_find(10)
print(myInstance.union(0,4))
print(myInstance.union(3,4))

あなたが実際に今やっていることは次のとおりです。

myInstance = quick_find(10)
print(myInstance.union(0,4))

mySecondInstance = quick_find(10)
print(mySecondInstance.union(3,4))

..これは明らかに、思い通りに動作しません ;)

于 2013-03-31T11:48:59.197 に答える