2011-11-26 99 views
4

我用Python创建了像这样两个列表:两个列表成为一个字典

list1 = [2, 3, 3, 4, 4, 5] 
list2 = [-4, 8, -4, 8, -1, 2] 

现在我拉上这两个列表成为一个字典,像这样:

d = dict(zip(list1, list2)) 

这给了我:

{2: -4, 3: -4, 4: -1, 5: 2} 

我想得到的结果是这样的:

{2: -4, 3: 4, 4: 7, 5: 2} 

list1正在成为新词典的关键。如果我在list1中有两个相同的值,我希望它添加两个值。例如,在列表2,8和-4都具有相同的键3.是否有办法将这两个值加在一起所以关键的模样

{3: 4} 

回答

10

我想你想SOMET hing是这样的:

>>> list1 = [2, 3, 3, 4, 4, 5] 
>>> list2 = [-4, 8, -4, 8, -1, 2] 

>>> d = {} 
>>> for k, v in zip(list1, list2): 
     d[k] = d.get(k, 0) + v 

>>> d 
{2: -4, 3: 4, 4: 7, 5: 2} 
+1

+1我更喜欢defaultdict,因为它表达了意图,但是你对于初学者更容易理解'get'有所帮助。 –

+0

谢谢,这个工作完美。我甚至没有想过用get。另一个问题是,我知道词典是无序的,但是能否显示从最高键到最低键的词典? – me45

+2

@ user1067296查看排序结果的最简单方法是“print sorted(d.items(),reverse = True)''。 –

7

尝试使用defaultdict

from collections import defaultdict 

d = defaultdict(int) 
for k, v in zip(list1, list2): 
    d[k] += v 

结果:

 
defaultdict(<type 'int'>, {2: -4, 3: 4, 4: 7, 5: 2}) 

看到它联机工作:ideone

+3

这是一个很好的答案,但我认为初学者需要在被引入* collections.defaultdict *之前暴露给* dict.get()*。前者为核心数据类型打下坚实的基础。后者需要知道工厂函数,知道* int()*没有参数返回零,并且生成的defaultdict显示不同于普通字典。 –

0

只要记住,当你排序时,你会产生很大的成本(O(nlogn))。也很可能有一个O(n)临时空间(内存)的使用。字典被设计为最好地完成一项工作 - 这是快速查找/添加/删除 - 不按照排序顺序遍历所有项目(以未排序的顺序行走仍然很好)。对于少数项目,这不是问题。了解其优势和局限性,确定正确的数据结构是很好的。还有其他的数据结构,如树,可以提供有序的步行而不需要很高的成本(它们可以在O(n)中完成)。