【问题标题】:How to merge a dictionary with two lists as the value?如何将具有两个列表的字典合并为值?
【发布时间】:2019-08-27 03:28:36
【问题描述】:

我有一本这种格式的字典:

{
    'a': ([1,2,3],[-1,-2,-3]),
    'b': ([1,2,3],[-1,-2,-3]),
    'z': ([],[-1])

}

还有一个:

{
    'a': ([4,5],[]),
    'c': ([1,2,3],[-4]),
    'z': ([],[-3])
}

我想把它们合并成这种格式:

{
    'a': ([1,2,3,4,5],[-1,-2,-3]),
    'b': ([1,2,3],[-1,-2,-3]),
    'c': ([1,2,3],[-4]),
    'z': ([],[-1,-3])
}

我该怎么做呢?我对 Python 也很陌生,我想知道这是否是表示我的数据的最佳方式,以及是否应该使用一些数据结构来代替字典。

【问题讨论】:

  • 为什么在合并a时忽略了空的[],而在合并z时包含了?
  • 在第一个字典中,元组的第二个值具有 [-1,-2,-3] 因此结果字典的第二个键 'a' 列表为 [-1,-2, -3]
  • “你应该使用一些结构”来公平地回答这个问题,重要的是要了解你为什么要做这些事情,这些数字意味着什么等等。
  • Python 的一大优点是它内置的数据结构,如集合、列表、元组和字典。现在,据我所知,您已经选择了正确的数据结构。
  • 如果你的元组有dict 值,你需要重新考虑它的结构,因为元组是不可变的。

标签: python list dictionary merge tuples


【解决方案1】:

试试这个:

d1 = {'a': ([1,2,3],[-1,-2,-3]),'b': ([1,2,3],[-1,-2,-3]),'z': ([],[-1])}
d2 = {'a': ([4,5],[]),'c': ([1,2,3],[-4]),'z': ([],[-3])}
d3 = {}
d4 = {**d1, **d2}  # This will work for Python 3.5+
for k in d4:
    if k in d2 and k in d1:
        tm = (d1[k][0]+ d2[k][0], d1[k][1]+d2[k][1])
        d3[k] = tm
    elif k in d2 and k not in d1:
        d3[k] = d2[k]
    else:
        d3[k] = d1[k]

输出

d3 = {'a': ([1, 2, 3, 4, 5], [-1, -2, -3]), 'b': ([1, 2, 3], [-1, -2, -3]), 'z': ([], [-1, -3]), 'c': ([1, 2, 3], [-4])}

【讨论】:

    【解决方案2】:

    您可以将此问题分为两个步骤,使用处理合并的辅助函数。

    dict1 = {
        'a': ([1,2,3],[-1,-2,-3]),
        'b': ([1,2,3],[-1,-2,-3]),
        'z': ([],[-1])
    
    }
    
    dict2 = {
        'a': ([4,5],[]),
        'c': ([1,2,3],[-4]),
        'z': ([],[-3])
    }
    
    def ordered_list_merge(lst1, lst2):
         ''' 
         Merges two lists, and does not add duplicates from lst2 into lst1
         '''
        resulting_list = lst1.copy() #to ensure list 1 is not mutated by changes to resulting_list
        resulting_list.extend(x for x in lst2 if x not in resulting_list)
        return resulting_list
    
    import copy
    result_dict = copy.deepcopy(dict1) #to ensure result_dict is an entirely new object, and mutations on result_dict do not affect dict1
    
    for k, v in dict2.items():
        if k not in result_dict:
            result_dict[k] = v
        else:
            result_dict[k] = tuple(ordered_list_merge(lst1, lst2)
                                for lst1, lst2 in 
                                zip(result_dict[k], v))
    print(result_dict) 
    #Output:
    {'a': ([1, 2, 3, 4, 5], [-1, -2, -3]),
     'b': ([1, 2, 3], [-1, -2, -3]),
     'z': ([], [-1, -3]),
     'c': ([1, 2, 3], [-4])}
    

    请注意,字典本质上是无序的(或记住 python 3.7+ 中的插入顺序),不应依赖于顺序。使用排序来获取元组列表,或者如果顺序也很重要,则使用 OrderedDict。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 2017-04-20
      • 1970-01-01
      相关资源
      最近更新 更多