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')

  • 对于dictionary
    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()