4

私は Python 2.75 を使用する新しいプログラマーです

by_saleこの形式で呼び出されるネストされた辞書があります。

{sale : {days_elapsed: daily_sales_amount}}.

例えば:

{'Spring Savings 0413' : {1 : 3000, 2: 2000, 4:1000}, 
 'Back to School 0812' : {1: 4000, 3:3000, 4:2000}}

「Spring Savings 0413」には Day 3 がなく、「Back to School 0812」には Day 2 がないことに注意してください。

by_day次のように、新しい販売がない日でも、毎日と各販売の現在の合計を保存するという新しい辞書を作成しようとしています。

{1: {'Spring Savings 0413': 3000, 'Back to School 0812': 4000}, 
 2: {'Spring Savings 0413': 5000, 'Back to School 0812': 4000}, 
 3: {'Spring Savings 0413': 5000, 'Back to School 0812': 7000}, 
 4: {'Spring Savings 0413': 6000, 'Back to School 0812': 9000}}

これが私のコードです:

by_day = {}
for sale in by_sale.iterkeys():
    running_total = 0
    for i in range(1,4): #check for each day in the first 4 days
        by_day[i] = {} #initialize a nested blank dictionary for each day
        daily_amount = by_sale[sale].get(i,0) #grab the amount for the day, if none, return a zero
        running_total += daily_amount
        by_day[i][sale] = running # --> I know this is my problem... but why?
print by_day

返されるのは、他の販売データを上書きしているように見える最後の販売の値のみです。

{1: {'Back to School 0812': 4000}, 
 2: {'Back to School 0812': 4000}, 
 3: {'Back to School 0812': 7000}, 
 4: {'Back to School 0812': 9000}}

ここで何が起こっているかはなんとなくわかります...それを止める方法がわかりません。どんなポインタでも大歓迎です!

4

2 に答える 2

1

を使用して、ループごとに各キーのエントリを上書きしていますby_day[i] = {}。キーの存在を確認する必要があります。その場合は、既存の辞書を更新する必要があります。

または、コレクションを使用します。defaultdict:

>>> by_sale = {'Spring Savings 0413' : {1 : 3000, 2: 2000, 4:1000}, 'Back to School 0812' : {1: 4000, 3:3000, 4:2000}}
>>> 
>>> 
>>> from collections import defaultdict
>>> 
>>> by_day = defaultdict(dict)
>>> for sale, sale_info in by_sale.iteritems():
...     running_total = 0
...     for i in range(1,5):
...         daily_amount = sale_info.get(i,0)
...         running_total += daily_amount
...         by_day[i].update({sale:running_total})
... 
>>> 
>>> dict(by_day)
{1: {'Spring Savings 0413': 3000, 'Back to School 0812': 4000}, 
 2: {'Spring Savings 0413': 5000, 'Back to School 0812': 4000}, 
 3: {'Spring Savings 0413': 5000, 'Back to School 0812': 7000}, 
 4: {'Spring Savings 0413': 6000, 'Back to School 0812': 9000}}

range(1, 5)代わりに使用する必要があります。range(1, 4)- を与え[1, 2, 3]ます。

于 2013-07-29T19:09:00.043 に答える