2016-11-11 9 views
1

値:更新新しい辞書のキー+増分古い辞書は、私は常にこのような構造でプレイリストを作成しています

playlist = {u'user1': {u'Roads': 1.0, u'Pyramid Song': 1.0, u'Go It Alone': 1.0}} 

と私はディレクトリにアップロードします。その後、ファイルがすでにアップロードされているかどうかを確認します。

if os.path.exists('db/playlist.json'): 
      with open('playlist.json', 'r+') as f: 
       plist = json.load(f) 
       # increment track count 
       updateTrackCounts(db_1,value=1) 
       #update json here 
       f.seek(0) 
       f.truncate() 
       json.dump(plist, f) 
       print (plist) 

私は1つでトラックcountsをインクリメント@Moses Koledoyeによって提案されたこのワーキング機能updateTrackCounts()を、使用しています。前に生成されたdictionaryには存在しなかった

def updateTrackCounts(d, value=0): 
    for i in d: 
     if isinstance(d[i], dict): 
      updateTrackCounts(d[i], value) 
     elif isinstance(d[i], float): 
      d[i] += value 

updateTrackCounts(playlist, value=1) 

時には新しいkeysを持つことになります生成された新しいplaylist

、。それは increment functionがあらかじめ既存の filekeysを既存事前に適用され、常に= 1.0 valueで新しい keysを熟考する plistを更新?作るので、私は上記のコードを微調整するにはどうすればよい

innerdictionary内の1つの新しい鍵と

望ましい結果:

playlist = {u'user1': {u'Bittersweet Symphony':1.0, u'Roads': 2.0, u'Pyramid Song': 2.0, u'Go It Alone': 2.0}} 
+0

@Moses Koledoye –

答えて

2
d.get(i,0) 

ようなキーが他の0、存在する場合は、キーiの値を返します。だからではなく、

d[i] += value 

のあなたは

d[i] = d.get(i,0) + value 
-1

私はあなたがより良いあなたの変数を標識することにより開始すべきだと思います。

あなたはなかれだけの大部分は、あなたが新しいキーを追加することはありません、キーは必要がない場合、これは速くなりますので、これはif文よりも優れている

try: 
    d[i] += value 
except KeyError: 
    d[i] = 1.0 

以外試みを使用することができ

追加されます。

+0

を書くことができますが '値を使用して新しい' key'に気付かなかった:1.0'(新しいアイテム)所望の出力に? –

+0

私は 'd [i] = value'を' d [i] = 1.0'に変更しました。したがって、新しい鍵を1.0に初期化する必要があります –

+0

__never__裸のexcept節を使用し、常に予想される例外タイプを使用してください。 'value'が文字列、' None'、または浮動小数点やintに追加できない型の場合には、既存のキーを '1.0'にリセットしたくないでしょうか? –

関連する問題