Как объединить словарь с двумя списками в качестве значения? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть словарь в этом формате:

{
    '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, и мне интересно, будет ли это лучшим способом представления моих данных, и есть ли какая-то структура данных, которую я должен использовать вместо словаря.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Попробуйте это:

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])}
1 голос
/ 05 апреля 2019

Вы можете разбить эту проблему на два этапа, используя вспомогательную функцию, которая обрабатывает объединение.

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, если порядок также важен.

...