2014-12-02 56 views
-2

如果我正在閱讀各種對象並遞增其相應字典鍵(例如,類別)的值,其中字典的值是列表,則所有字典條目最後得到相同的值,這是所有值的總和,而不是預期的值。如果字典的值是一個float/int而不是一個列表,這不會發生。遞增字典值總是結束

category_dict = dict(zip(category_list,[0,0]*len(category_list))) 
for item in data: 
    i = item['Type']: 
    category_dict[i][0] += item['Amount'] 

結果是這樣的:

{item1: 98999, item2: 98999, item3: 98999...} 

其中98999是所有金額的總和。

任何幫助表示讚賞。

+1

'category_dict = dict.fromkeys(category_list,0)'會更具可讀性。 – 2014-12-02 16:54:56

+1

'category_list'看起來像什麼?什麼是數據?請提供有用的和有意義的代碼。 – wenzul 2014-12-02 16:59:47

+0

@MartijnPieters它不僅更具可讀性,而且也是正確的,因爲OP只填入'category_dict'只引用同一個[[0,0]'list_,當然當他增加一個值時,所有的值字典也會增加。 – gboffi 2014-12-02 21:52:45

回答

0

你可以使用一個defaultdict:

category_dict = collections.defaultdict(int) 
for item in data: 
    cat = item['Type'] 
    n = item['Amount'] 
    category_dict[cat] += n 

這應該給你這樣的:

{item1: 53, item2: 12, item3: 4...} 

我不是很肯定這就是你想要什麼,雖然。 您正在討論每個類別的列表,但您只使用該列表的[0]。

編輯:

如果您需要爲每個類別的兩個元素的列表,你可以使用:

category_dict = collections.defaultdict(lambda: return [0,0]) 
for item in data: 
    cat = item['Type'] 
    n = item['Amount'] 
    category_dict[cat][0] += n 

這應該給你的東西,如:在

{item1: [53,0], item2: [12,0], item3: [4,0]...} 
+0

OP實際上並不希望*這個*。他們想要名單.. – 2014-12-02 17:19:35

+0

@MartijnPieters恕我直言,這是不是很清楚。 'category_dict = dict.fromkeys(category_list,0)'也產生完全相同的結果。 – PeterE 2014-12-02 17:25:41

+0

是的,OP在這裏試圖做什麼還很不清楚。 – 2014-12-02 17:28:48

0

所有值你的字典是相同的列表。當你增加

category_dict[i][0] += item['Amount'] 

你在字典中做同樣的所有項目的值

這是因爲你實例這樣

category_dict = dict(zip(category_list,[0,0]*len(category_list))) 

[0,0]*n字典是一個列表n同樣的副本[0,0]列表

請改爲

category_dict = {k:[0,0] for k in category_list} 
+0

'[0,0] * n'產生一個'n * 2'對'0'整數的引用列表。它不會生成列表中引用列表的列表。你在這裏想着'[[0,0]] * n'。列表的乘法將重複該列表的*內容*,不會生成重複列表中重複列表的新列表。 – 2014-12-02 21:59:32

+0

我應該知道它更好......我可以嘗試證明我的錯誤,觀察OP代碼的工作原理_only if_字典項的值是列表,正如我在OPost – gboffi 2014-12-02 22:13:00

+0

下的註釋中詳細說明的那樣沒關係gboffi,我有同樣的答案和Martijn投了贊成票。我決定刪除我的答案,而不是等待OP向我們展示他的* real *代碼。但我同意你的看法,這是他的問題。 OP甚至建議他發佈的代碼與他的真實代碼不匹配,即引用「字典值是列表的位置,所有字典條目都以相同的值結束,這是所有值的總和而不是預期的,如果字典的值是一個float/int而不是一個列表,這將不會發生。「 – b4hand 2014-12-03 16:39:05