2014-12-02 111 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