2016-12-02 1 views
0

私はPythonの初心者で一般的なプログラミングです。私はPyschoolの練習問題Top 8、Q 11をスペアVectoreに変換していました。Python:Spare Vectorの辞書

私は、辞書をその派閥ベクトル表現に戻す変換関数を書くように求められました。

>>> convertDictionary({0: 1, 3: 2, 7: 3, 12: 4}) 
[1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4] 
>>> convertDictionary({0: 1, 2: 1, 4: 2, 6: 1, 9: 1}) 
[1, 0, 1, 0, 2, 0, 1, 0, 0, 1] 
>>> convertDictionary({}) 
[] 

私は何度も試みてきました。以下は、私が持っている最新のコードされています

def convertDictionary(dictionary): 
    k=dictionary.keys() 
    v=dictionary.values() 
    result=[] 
    for i in range(0,max(k)): 
     result.append(0) 
     for j in k: 
      result[j]=v[k.index(j)] 
    return result 

返されるエラーは、次のとおりです。

Traceback (most recent call last): 
File "Code", line 8, in convertDictionary 
IndexError: list assignment index out of range 

誰も私を助けてもらえますか?どうもありがとうございます!このような

+0

リストが作成される前にリスト要素にアクセスしようとしました。まず、すべての0のリストを作成します。vector = [0] * max(k) '。次に、内部ループを使用して非ゼロを更新します。 – DyZ

答えて

0

何かで十分です:

M = max(dictionary, default=0) 
vector = [dictionary.get(i, 0) for i in range(M)] 

はに翻訳昔ながらのforループ

M = max(dictionary, default=0) 
vector = [] 
for i in range(M): 
    vector.append(dictionary.get(i, 0)) 

getメソッドは、キーが欠落している場合の第2引数にデフォルト値を提供することができます。より多くの進歩を得たら、defaultdict

編集:maxのデフォルトパラメータは、Python> 3.4を必要とします。例外処理(一般に推奨)を使用するか、空の辞書の明示的なチェックを使用して、以前のバージョンを使用している場合はそのケースを処理できます。

0

コードは論理的にはうまく動作しますが、インデントに問題があります。あなたの関数は次のようになります。

def convertDictionary(dictionary): 
    k=dictionary.keys() 
    v=dictionary.values() 
    result=[] 
    for i in range(0,max(k)): 
     result.append(0) 
    for j in k: 
     result[j]=v[k.index(j)] 
    return result 

問題がforあなたの第二は、最初の中にあったということです。あなたが望むのは、max(k)要素でリストを作成し、それに正しい値を入れることです。次に、2つのループは、一方が他方の内側になるのではなく、順番に1つずつでなければなりません。

+2

@DYZそれは要点ではないが、OPはコードに何が間違っているか知りたい。 –

+1

最初のループを変更しようとするなら、それは必要ではないことに気付くことから始めるでしょう。ごくまれに、Pythonでリストをあらかじめ用意する必要があります。 –