将两个列表转换成字典

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中有两个相同的值,我希望将它们相加。例如,在list2中,8和-4都具有相同的键3。是否有一种方法可以将这两个值相加,使键看起来像

{3: 4}   
4个回答

10

我认为你想要的是这样的:

>>> 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对于初学者更容易理解也是有道理的。 - Mark Byers
谢谢,这完美地解决了问题。我甚至没有想过使用get。另外一个问题,我知道字典是无序的,但是否有可能按从最大键到最小键的顺序显示字典呢? - me45
2
@user1067296 最简单的查看有序结果的方法是 print sorted(d.items(), reverse=True) - Raymond Hettinger

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()返回零,以及resulting defaultdict与常规字典显示不同。 - Raymond Hettinger

0

在排序时,请记住您会产生很大的成本(O(nlogn))。同时,很可能会使用O(n)的临时空间(内存)。字典被设计为最擅长一项工作——快速查找/添加/删除——而不是按排序顺序遍历所有项目(按未排序顺序遍历仍然可以)。对于少量项目,这不是问题。通过了解数据结构的优点和局限性来确定正确的数据结构是很好的。还有其他数据结构,如树,可以提供有序遍历而不会产生巨大的成本(它们可以在O(n)时间内完成)。


0
你可以尝试使用字典推导式将两个列表合并成一个字典。
list1 = [2, 3, 3, 4, 4, 5]
list2 = [-4, 8, -4, 8, -1, 2]

{k:v for k,v in zip(list1,list2)}

输出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接