在python中,组合两个字典的值

在python中,组合两个字典的值,python,dictionary,Python,Dictionary,我是Python新手,关于Python中的字典,我有两个问题 我有dict1(其中值已经是list),然后我有dict2,具有与dict1相同的键,我想将新值添加到dict1中值的列表中。我怎么写呢?你能举例说明吗 dict1 = {'uid': ['u1'], 'sid': ['s1'], 'os': ['os1']} dict2 = {'uid': ['u2'], 'sid': ['s2'], 'os': ['os2']} 预期产出: dict1 = {'uid': ['u1', 'u2

我是Python新手,关于Python中的字典,我有两个问题

  • 我有
    dict1
    (其中值已经是
    list
    ),然后我有
    dict2
    ,具有与
    dict1
    相同的
    键,我想将新值添加到
    dict1
    中值的
    列表中。我怎么写呢?你能举例说明吗

    dict1 = {'uid': ['u1'], 'sid': ['s1'], 'os': ['os1']}
    
    dict2 = {'uid': ['u2'], 'sid': ['s2'], 'os': ['os2']}
    
    预期产出:

    dict1 = {'uid': ['u1', 'u2'], 'sid': ['s1', 's2'], 'os': ['os1', 'os2']}
    

  • 我将处理一个文本文件中的许多行,每一行创建一个新字典。以下是我的代码的想法:

    count = 0
    
    for line in f:
    
        if count == 0:
            dict1 = parse_qs(line)
            count = count+1
        else:
            dict2 = parse_qs(line)
            #combine dict1 with dict 2, and assign the new dict to dict1
    
  • 有没有更好的方法使用更少的内存或运行更快(仍然使用字典)

    提前感谢您的帮助

    你可以这样做

    for key in dict1.keys():
         if dict2.has_key(key):
             dict1[key].extend(dict2[key])
    
    如果您使用的是
    python3
    ,您可以在dict2中使用
    key,而不是
    dict2。has_key(key)

    结果

    {'os': ['os1', 'os2'], 'sid': ['s1', 's2'], 'uid': ['u1', 'u2']}
    

    由于显然不允许您重写解析器,您可以执行以下操作:

    for k in dict1:
        dict1[k].extend(dict2.get(k, []))
    
    如果两个DICT中的密钥始终匹配,则可以删除
    .get
    并使用直接订阅

    for k in dict1:
        dict1[k].extend(dict2[k])
    

    否则,您可以创建一个
    defaultdict(list)
    ,并让解析器将值附加到其中。

    如果您不再需要这两个词典,则可以执行以下操作:

    def merge_dict(dict1, dict2):
        for k in dict1:
            try:
                dict1[k].extend(dict2[k])
            except KeyError:
                pass
        return dict1
    
    否则,如果您想保留它们以备将来使用,请尝试此方法

    def merge_dict(dict1, dict2):
        new_dict = {}
        keys = dict1.keys() + dict2.keys()
        for k in keys:
            try:
                new_dict[k] = dict1[k]
            except KeyError:
                new_dict[k] = dict2[k]
                continue
            try:
                new_dict[k]+= dict2[k]
            except KeyError:
                pass
        return dict1
    

    这可能对你有帮助

    from itertools import chain
    from collections import defaultdict
    
    # ------ for dict1 -------#
    
    u1 = [1,2,3]
    s1 = ['a','b','c']
    x1 = [10,100,1000]
    
    # ------ for dict2 -------#
    
    u2 = [4,5,6]
    s2 = ['d','e','f']
    x2 = ['aa','bb','cc']
    
    dict1 = {1:u1,2:s1,3:x1}
    dict2 = {1:u2,2:s2,3:x2}
    
    dict3 = defaultdict(list)
    for a, b in chain(dict1.items(), dict2.items()):
         dict3[a].append(b)
    
    #for a, b in dict3.items():
    #    print(a, b)
    
    print dict3
    

    不要创建多个dict。创建一个
    defaultdict(list)
    ,让您的解析器向其附加值。我正在使用urlparse,因此它会自动为我提供一个dict。这是我尝试清理数据的最佳方式。不过还是要谢谢。这肯定是重复的。在这里使用
    extend
    会更好
    .extend(dict2[key])
    dict2
    的值可能为len>1,dict2中的
    key
    has\u key
    更受欢迎,因为从永远以来,
    has\u key
    甚至在Python 3中消失了。