我有两个列表
list1= [6, 1, 8, 1, 2]
list2= ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"]
我想尝试像
这样的结果(14,"mailopened") (4,"mailnotopened")
首先我尝试将它们转换为Dict,但它不接受重复值。 是否可以根据第二个列表添加这些列表。
答案 0 :(得分:7)
使用defaultdict
,只需添加list1
的值。
from collections import defaultdict
list1 = [6, 1, 8, 1, 2]
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"]
added = defaultdict(int)
for i, k in enumerate(list2):
added[k] += list1[i]
这是有效的,因为如果访问的密钥不存在,defaultdict
会提供默认值。在这种情况下,它会提供默认值0
,因为我们指定它是int
类型。
使用@GaretJax窃取的enumerate()
。 :)
答案 1 :(得分:4)
dict_out = dict()
for list1_val, k in zip(list1, list2):
dict_out[k] = dict_out.get(k, 0) + list1_val
输出:
In [10]: dict_out
Out[10]: {'not open': 4, 'open': 14}
说明:
zip(list1, list2)
相当于序列(6, 'open'), (1, 'not open'), ..., (2, 'not open')
。
对于字典dict_out
,dict_out.get(k, 0)
会返回dict_out[k]
(如果存在),否则为0
。
因此,for
循环遍历五个(值,键)对并将它们累积在字典dict_out
中。
答案 2 :(得分:2)
from collections import defaultdict
list1 = [6, 1, 8, 1, 2]
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"]
d = defaultdict(lambda:0)
for i, k in enumerate(list2):
d[k]+=list1[i]
print d
print d.items()
编辑:使用相同的解决方案(见上文),voitos更快