2016-10-12 10 views
0

私はPythonには初めての学生です。私は、その唯一のメンバ変数として辞書を使用する配列クラスを定義しようとしています。私は、Pythonが唯一の構造化型として辞書を実装していると仮定しています(つまり、配列、リスト、タプルなどはありません)。辞書を使用して配列クラスを作る

私はそのようなプログラムをコーディングするのが難しいです。

これは私のコードです:

class array(object): 
    def __init__(self): 
     self.dic={} 

    def __init__(self,diction): 
     self.dic = {} 
     for x in diction: 
      self.dic.append(x) 

    def __setitem__(self,key,value): 
     self.dic[key]=value 

    def __getitem__(self,key): 
     if key not in self.dic.keys(): 
      raise KeyError 
     return self.dic[key] 

私はプログラムがこのように仕事をしたい:

a = array('a','b','c') #------output------ 

print(a) # ['a', 'b', 'c'] 

print(a[1]) # b 

a[1] = 'bee' 

print(a) # ['a', 'bee', 'c'] 

a[3] = 'day' 

print(a) # ['a', 'bee', 'c', 'day'] 

print(a[6]) # IndexError exception 

任意の提案、アドバイス。 :)

+0

なぜ2つの__init__関数がありますか? –

+1

Pythonは複数のコンストラクタの意味でのオーバーロードをサポートしていないので、1つの '__init__'(2番目)だけが使用されます。代わりにデフォルトの引数を使用する –

+1

クラス配列を呼び出さないことをお勧めします。同じ名前のPythonデータ構造と衝突することになります。代わりにMyArrayなどと呼んでください。 @DanielleM。 –

答えて

1

はかなりの数のクラス定義に問題があります。適切なPythonのクラスの命名規則(MyClass)を使用して名前を変更することをお勧め:

  • arrayは、すでにデータ構造です。
  • 関数定義をオーバーロードすることはできません。アンパック演算子(*)を使用してすべての(存在する場合)引数を抽出する方がよい。
  • 辞書に追加することはできません。キーに割り当てる必要があります。
  • への呼び出しでは、__str__という魔方法を指定していないため、汎用クラス名が表示されます。 dictは順序が整っていないので、私はそれがより良い方法があると確信しています。
  • KeyError__getitem__に設定する必要はありません。なぜなら、これはいずれにしても発生するからです。
  • 最後に、スペースを修正しました。

テストケースを動作させるために必要なメソッドしか実装していないことに注意してください。

class MyArray(object): 
    def __init__(self, *diction): 
     self.dic = {} 
     for i, x in enumerate(diction): 
      self.dic[i] = x 

    def __setitem__(self, key, value): 
     self.dic[key] = value 

    def __getitem__(self, key): 
     return self.dic[key] 

    def __str__(self): 
     return str([self.dic[i] for i in sorted(self.dic.keys())]) 
+0

それは動作します。お返事をありがとうございます。 –

関連する問題