Перевести информацию из двух словарей в список словарей - PullRequest
0 голосов
/ 16 октября 2018

Я полагаю, что это не так легко объяснить словами, но с примером это должно быть довольно ясно.

Предположим, у меня есть словари link_vars и y:

link_vars = {'v1':'AAA', 'v2':'BBB', 'v3':'CCC'}
y = {'v1':[1,2,3], 'v2':[4,5,6], 'v3':[7,8,9]}

И я хочу построить список desired_output:

desired_output = [{'AAA':1 , 'BBB':4, 'CCC':7},
                  {'AAA':2 , 'BBB':5, 'CCC':8},
                  {'AAA':3 , 'BBB':6, 'CCC':9}]

Итак, я хочу «перевести» ключи в y в соответствии с записями в словаре link_vars, изатем разбейте списки в y на небольшие словари для построения desired_output.Ключи y и link_vars всегда будут одинаковыми, и длина каждого списка в значениях y также будет одинаковой (то есть не будет списка с 4 элементами и другого с5).

Я не могу придумать умный способ сделать это.Я надеюсь, что есть эффективный способ сделать это, поскольку длина выходного списка (которая равна длине каждого списка в значениях y) может быть довольно большой.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вот решение, которое связывает два словаря:

from operator import itemgetter

keys = itemgetter(*y)(link_vars)
res = [dict(zip(keys, v)) for v in zip(*y.values())]

[{'AAA': 1, 'BBB': 4, 'CCC': 7},
 {'AAA': 2, 'BBB': 5, 'CCC': 8},
 {'AAA': 3, 'BBB': 6, 'CCC': 9}]

Объяснение

  1. Сначала определите keys, который извлекает значения из link_vars в порядке, согласованном с ключами от y.
  2. Во-вторых, используйте понимание списка и zip предварительно вычисленный keys с транспонированной версией y.values().Мы предполагаем, что y.values() повторяется последовательно с y.keys(), что верно в Python 2.x и 3.x.
0 голосов
/ 16 октября 2018

Хорошо, тогда хорошо.Понимание списка должно выполняться в этом случае:

output = [dict(zip(link_vars.values(),i)) for i in zip(*y.values())]
print(output)

Возвращает:

[{'AAA': 1, 'BBB': 4, 'CCC': 7},
 {'AAA': 2, 'BBB': 5, 'CCC': 8},
 {'AAA': 3, 'BBB': 6, 'CCC': 9}]

Принимая во внимание комментарий jpps, возможно, более подходящим подходом было бы сначала убедиться, чтомы получим правильные значения, объединив эти данные.

temp_d = {v:y.get(k) for k,v in link_vars.items()}
output = [dict(zip(temp_d.keys(),i)) for i in zip(*temp_d.values())]

Или использование библиотеки панд может быть излишним, но синтаксис легко понять, так как нам нужно только объединить эти слова и обработатьоставайтесь с to_dict() func.

import pandas as pd
output = pd.DataFrame({v:y.get(k) for k,v in link_vars.items()}).to_dict('r')

Пояснение

Ключевая идея здесь - сжать значения y.Это сделано с zip(*y.values()).И запуск понимания списка: [i for i in zip(*y.values())], что равняется [(7, 4, 1), (8, 5, 2), (9, 6, 3)], оставшаяся часть состоит в том, чтобы сжать каждый компонент с помощью AAA,BBB,CCC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...