2017-07-19 6 views
0

私はPythonの新機能で、既存のディクショナリをループするスクリプトを作成しようとしています。既存の辞書は、私がオンラインで見つけたいくつかのコードから作成され、SQLクエリから行を1つの辞書に変換します。私はこれが少し冗長であることを知っています、私はちょうど私が望むものを表示させるためにこのコードを編集する方法を知らない。 、とにかくhttps://geert.vanderkelen.org/2010/fetching-rows-as-dictionaries-with-mysql-connectorpython/Forループでディクショナリを作成するときにネストされたディクショナリ値を上書きしないようにする

私はこれを行う際に、ネストされた辞書が自動的にネストされた辞書のための辞書のキーが変更されていても、以前のネストされた辞書を上書き:

はここでスクリプトです。私は検索し、同じ問題でいくつかの他のStackOverflowの質問を見つけましたが、私のコードのための解決策を見つけることができませんでした。

{u'KBFI ':{date_obs':datetime.datetimeの私は(より多くの辞書のエントリではあるが)このような何かを得るでしょう

row=curs.fetchone 
    d={} 
    D={} 
    while row is not None: 
     station=row[u'STATION'] 
     date_obs=row[u'DATE_OBSERVATION'] 
     temperature=row[u'TMPC'] 
     altimeter=row[u'ALTM'] 
     dewpoint=row[u'DWPC'] 
     windspeed=row[u'SPED'] 
     winddirection=row[u'DRCT'] 
     for i in ('date_obs', 'temperature', 'altimeter', 'dewpoint', 'windspeed', 'winddirection'): 
      d[i]=locals()[i] 
     D[station]=d 
     row = curs.fetchone() 
print D 

はここに私の関連するコードです '温度':10進('21 .00 ''露点: '10進(' 4.00 ')、 '高度計 ':10進数('30 .10')、 '風速':10進数( '3.00')、 'winddirection':10進数( '310.00')、u'KKLS ':{date_obs': datetime.datetime ('30 .10 ')、 ' windspeed ':10進数('21 .00' 012,003,125,16,13,14,15,16) ( '3.00')、 'winddirection':10進数( '310.00')}}

など何かしたい:

{u'KBFI ':{date_obs':datetime.datetimeの(2017 ('30 .06 ')、' windspeed ':10進数('19 .00' '露点:' 10進数( '5.00')、 、 '7,19,16,53,' 4.00 ')、 ' winddirection ':10進数(' 270.00 ')、u'KKLS':{date_obs ': datetime.datetime(2017,7,19,16,56)、 'temperature':10進数('21 .00 ' '露点: '10進(' 4.00 ')、'高度計 ':10進数('30 .10')、 '風速':10進数(' 3.00 ')、 'winddirection':進:あなたが作成し、各ループで、その後

d = {} 

(' 310.00' )}}

+0

私が見る1つの問題は、あなたが持っている入力辞書が有効でないことです。 '' 'date_obs'''は引用符で囲まれておらず、' 'Decimal('21 .00''''は完全なカッコではありません。 – user2233706

答えて

0

あなたがしてd辞書を作成メインDの新しいエントリ:

D[station] = d 

しかし、たびに、dは非常に同じ辞書を指します。各ループの値をd[i] = ....に更新しましたが、それは同じオブジェクトのままです。

Dを印刷する場合、D['KBFI']D['KKLS']は、最後のループで指定したものと同じ辞書オブジェクトを参照します。

Pythonの言葉では、dictオブジェクトは可変であると言います。新しいオブジェクトを作成せずにオブジェクトの内容を変更することができます。

あなたが望む行動を得るためには、あなたが新しい各ループでd作成することができます。

while row is not None: 
    station = row[u'STATION'] 
    # .... 
    d = {} # Here, we create a new dict 
    for i in ('date_obs', 'temperature', 'altimeter', 'dewpoint', 'windspeed', 'winddirection'): 
     d[i] = locals()[i] 
    D[station] = d # D[station] now refers to our new dict 

しかしlocals()と、このハックは本当に醜いですが...あなたは、むしろ使用したい:

D={} 

row = curs.fetchone 
while row is not None: 
    station = row[u'STATION'] 
    D[station] = {'date_obs': row[u'DATE_OBSERVATION'], 
        'temperature': row[u'TMPC'], 
        'altimeter': row[u'ALTM'], 
        'dewpoint': row[u'DWPC'], 
        'windspeed': row[u'SPED'], 
        'winddirection': row[u'DRCT'] 
       } 
    row = curs.fetchone() 
print D 

それともとしてあなたのキー名とフィールド名の間にcorrespondanceのテーブルを維持し、あなたのコードを書き換えることができます:

fields = {'date_obs': u'DATE_OBSERVATION', 'temperature': u'TMPC'} # and so on... 

D={} 
row = curs.fetchone 
while row is not None: 
    station = row[u'STATION'] 
    D[station] = { key: row[field] for key, field in fields.items() } 
    row = curs.fetchone() 
print D 
辞書の理解を使用して

関連する問題