Python:合并两个列表
我有两张单子Python:合并两个列表,python,Python,我有两张单子 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,但它不接受重复的值。 是否可以根据第二个列表添加这些列表 dict_out = dict() for
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,但它不接受重复的值。
是否可以根据第二个列表添加这些列表
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,'notopen'),…,(2,'notopen')
dict\u out
,dict\u out.get(k,0)
返回dict\u out[k]
如果存在,否则0
for
循环在五个(值、键)对上迭代,并将它们累加到字典dict\u out
使用
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()
编辑:voitos使用相同的解决方案更快(见上文)在Python中,列表用方括号表示[]
。括号通常用于元组。对不起,我已经更正了我的问题。呵呵,很好。我注意到您使用了lambda
而不是指定int
。也许int
的性能会稍好一些?再说一次,enumerate()
可能比zip()
快,hah.enumerate肯定也更节省内存…;-)根本没想过用int。。。下次我会记得的!顺便说一句@voithos,请随意编辑您的答案,使用枚举;没有理由让下一个出现类似问题的用户使用zip
;-)这是我以前从未见过的dict.get()
的好用法。谢谢我试过了,但它总是给我AttributeError:“long”对象没有属性“get”,这是使用zip函数的好方法吗?如果列表1和列表2的长度不同,则不适用于此问题;我假设list1
和list2
具有相同的长度。然而,zip
确实接受不同长度的iterable,但它只是将每个iterable截断为最短长度。示例:zip(['a','b','c'],[1,2])
返回[('a',1),('b',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()