2017-11-29 22 views
2

私はこの関数を持っています。それは変更してはいけません!機能clean()だけのユニークな配列を返す場合クラス関数の変数を変更する方法

class TestUnikati(unittest.TestCase): 
    def test_02_clean(self): 
     s = [5, 4, 1, 4, 4, 4, 4, 4, 3] 
     unique_array(s) #<-- calls the function 
     self.assertEqual(s, [5, 4, 1, 3]) 

基本的に我々はテストします。変数sが配列です。 これは、取得するには厄介な配列sだと私は多くのことをしようとした無重複要素

def unique_array(s): 
    s=unique(s) #<-- this is a function that just returns a unique array 
    x=TestUnikati() #<-- I store the class in the x variable 
    [insert a way to push s to the "TestUnikati.test_02_clean.s"] 

の配列を返すようにしようと私の関数です。私はglobals()とlocals()を使っていくつかの実験を試みただけでなく、xオブジェクト変数を持つ多くのものを試しましたが、私はそれを正しく理解していないようです。

xオブジェクトでlocals()TestUnikati.test_02_clean.sにプッシュしようとしました。クラス関数の関数がオーバーライドされ、self.assertEqual(s, [5, 4, 1, 3])が2を比較して渡すように保存する方法はありますか?このような何か:

x.test_02_clean.s=unique(s) 
or 
x.s=unique(s) 
+2

は、それはあなたの関数にオブジェクトを渡しています。それを置き換えるのではなく、それを変更する必要があります。 – jordanm

+3

私は混乱しています... 'unique()'は無限に繰り返すように見えます。 – glibdud

+0

私の悪い私はラベルを変更した、私はすぐに私の言語から英語に翻訳していたので、@glibdudは通知のためにありがとう –

答えて

1

test_02_clean()unique_array()の呼び出し結果を何にも割り当てていないので、指定したリストを変更する必要があります。このような何か:

def unique_array(s): 
    # Keep a set of all the items we've seen so far 
    seen = set() 
    # Index into list 
    i = 0 
    while i < len(s): 
     if s[i] in seen: 
      # Delete element from list if we've already seen it 
      del s[i] 
     else: 
      # Or else add it to our seen list and increment the index 
      seen.add(s[i]) 
      i += 1 

 

>>> s = [5, 4, 1, 4, 4, 4, 4, 4, 3] 
>>> unique_array(s) 
>>> s 
[5, 4, 1, 3] 
+0

Brilliant!新しい配列を作成するのではなく、既存の配列を変更するだけです。それは私の心を完全に崩した。乾杯! –

0

あなたは、例えば、代わりに新しいリストを返すので、場所にリストを変更する機能を必要とするunique()

def unique(l): 
count = {} 
for entry in l: 
    count[entry] = count.get(entry, 0) + 1 
for entry in l: 
    for _ in range(count[entry] - 1): 
     l.remove(entry) 

これは場所に動作します:

a = [1, 1, 1, 3, 4, 2] 
unique(a) 
print(a) 
>>> [1, 3, 4, 2] 
+0

申し訳ありません、この機能は実際に2回以上発生しません。私はそれを改善します。 – YSelf

0

あなたは以下のように世界的にアクセスするために、あなたのクラス変数を変更しておく必要があります -

class TestUnikati(unittest.TestCase): 
    def test_02_clean(self): 
    self.s = [5, 4, 1, 4, 4, 4, 4, 4, 3] 
    unique(self.s) <-- calls the function 
    self.assertEqual(self.s, [5, 4, 1, 3]) 

とも短絡価値をあなたにそれを再割り当てします次のようにする必要があります。 -

self.s=unique(s) 
+0

それは私が認識しているが、問題は、クラスに触れてはならないということです。一意の関数だけが編集可能なものですが、それ以外は許されません。 (コーディングプロジェクトの一部) –

関連する問題