Отображать только разницу во вложенных диктантах - PullRequest
0 голосов
/ 20 декабря 2018

Данные поступают из базы данных и из файла CSV.Я должен сравнить их как можно быстрее и обновить таблицу базы данных на соответствующее значение.Предположим, что dict d1 поступает из базы данных как d2 из входного файла.Главный ключ - это первичный ключ в БД.(здесь 1 и 2)

d1[1] = {'a': 10, 'b': 20}
d1[2] = {'a': 11, 'b': 21}

Теперь поступают данные из входного файла:

d2[1] = {'b': 10, 'a': 20}
d2[2] = {'b': 21, 'a': 19}

Как видите, все значения различны для клавиши 1 и только для значения«а» отличается для ключа 2. У меня есть следующий запрос:

print({o: ({b: d2[o][b]}) for o in d1.keys() for b in d2[o].keys() if d1[o][b] != d2[o][b]})

Ожидаемый результат будет:

{1: ({'a': 20}, {'b': 10}), 2: {'a': 19}}

Вместо этого у меня есть этот результат (яне отображаются все измененные значения для 1):

{1: {'a': 20}, 2: {'a': 19}}

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

здесь есть решение (если вы не возражаете против решения более сложным способом)

d1={}
d2={}
d1[1] = {'a': 10, 'b': 20}
d1[2] = {'a': 11, 'b': 21}
d2[1] = {'b': 10, 'a': 20}
d2[2] = {'b': 21, 'a': 19}

d4={}

for o in d1.keys():
    d3=[]
    for b in d2[o].keys():
        if d1[o][b] != d2[o][b]:
               d3.append({b: d2[o][b]})
    d4.update({o:tuple(d3)})
print(d4) # require solution.
# print {1: ({'b': 10}, {'a': 20}), 2: ({'a': 19},)}

в вашем коде вы забыли добавить / обновить внутренние значения.

0 голосов
/ 20 декабря 2018

Вам нужно вложить в список файлов comp свои данные.

{o: [{b: d2[o][b]} for b in d2[o].keys() if d1[o][b] != d2[o][b]] for o in d1.keys()}
...