2016-04-01 8 views
1

私はPython OrderedDictを持っています。私は下からソースコードとトレースの両方を含んでいます。OrderedDict 1つのキー/値ペアの更新のみを目的とした場合、すべてのキー/値ペアを更新します

キーペア(2014、{'開始':2014、 '終了':2015})が必要ですが、ここでは該当しません。

import datetime 
import collections 
import math 
from decimal import Decimal 
from dateutil.relativedelta import relativedelta 



def get_ordered_dict(start, end, intial_value): 
    d = collections.OrderedDict() 
    for i in range(start, end+1): 
     d[i] = intial_value 
    return d 


start_year = 2014 
end_year = start_year + 39 + 1 
od = get_ordered_dict(start_year, end_year, {}) 

for year in od.keys(): 
    print year 
    d = od[year] 
    d['start'] = year 
    d['end'] = year + 1 
    print od 

戻り値:

def get_ordered_dict(start, end, intial_value): 
    d = collections.OrderedDict() 
    for i in range(start, end+1): 
     d[i] = intial_value 
    return d 

OrderedDict([(2014, {'end': 2053, 'start': 2052}), 
      (2015, {'end': 2053, 'start': 2052}), 
      (2016, {'end': 2053, 'start': 2052}), 
      (2017, {'end': 2053, 'start': 2052}), 
      (2018, {'end': 2053, 'start': 2052}), 
      (2019, {'end': 2053, 'start': 2052}), 
      (2020, {'end': 2053, 'start': 2052}), 
      (2021, {'end': 2053, 'start': 2052}), 
      (2022, {'end': 2053, 'start': 2052}), 
      (2023, {'end': 2053, 'start': 2052}), 
      (2024, {'end': 2053, 'start': 2052}), 
      (2025, {'end': 2053, 'start': 2052}), 
      (2026, {'end': 2053, 'start': 2052}), 
      (2027, {'end': 2053, 'start': 2052}), 
      (2028, {'end': 2053, 'start': 2052}), 
      (2029, {'end': 2053, 'start': 2052}), 
      (2030, {'end': 2053, 'start': 2052}), 
      (2031, {'end': 2053, 'start': 2052}), 
      (2032, {'end': 2053, 'start': 2052}), 
      (2033, {'end': 2053, 'start': 2052}), 
      (2034, {'end': 2053, 'start': 2052}), 
      (2035, {'end': 2053, 'start': 2052}), 
      (2036, {'end': 2053, 'start': 2052}), 
      (2037, {'end': 2053, 'start': 2052}), 
      (2038, {'end': 2053, 'start': 2052}), 
      (2039, {'end': 2053, 'start': 2052}), 
      (2040, {'end': 2053, 'start': 2052}), 
      (2041, {'end': 2053, 'start': 2052}), 
      (2042, {'end': 2053, 'start': 2052})]) 
+0

すべてのキーは、同じ辞書インスタンスを参照しています。 –

答えて

2

あなたは

od = get_ordered_dict(start_year, end_year, {}) 
、一人ひとり d[i]同じ initial_valueを参照するに、この場合も同じ辞書を割り当てます

だからあなたのループでは、非常に同じ辞書を何度も何度も繰り返し修正します。独自の辞書の参照を割り当てる

一つの方法は、initial_valueの(浅い)コピーを作成するために、次のようになります。

d[i] = intial_value.copy() # [sic] 

あなたはまた、initial_valueキーワード引数Noneデフォルトことを作ることができます:

def get_ordered_dict(start, end, intial_value=None): 
    ... 
     # assuming intial_value will always be a dict 
     d[i] = intial_value.copy() if intial_value is not None else {} 
+0

優れた説明、適切なソリューションを提供できますか?問題を解決するためのヒントもありますか? –

0

問題を解決するには、代わりにd[i] = intial_value.copy()を使用して、各エントリが異なる空のdictであることを確認します。

関連する問題