форматирование структуры словаря в python - PullRequest
0 голосов
/ 18 июня 2020

У меня есть список ввода в форме:

d=[{'CLIENT': ['A','B','C']},{'ROW':['1','2','3']},{'KP':['ROM','MON','SUN']}]

Я хочу, чтобы результат выглядел так:

S=[{'CLIENT':'A','ROW':'1','KP':'ROM'},
   {'CLIENT':'B','ROW':'2','KP':'MON'},
   {'CLIENT':'C','ROW':'3','KP':'SUN'},]

Как я могу сделать это в python? ключи словарей входных элементов могут измениться, поэтому я также не хочу жестко кодировать их в коде.

Ответы [ 4 ]

0 голосов
/ 18 июня 2020

Это еще один способ сделать это, используя пару раз встроенную функцию zip() и функцию chain() модуля itertools.

Идея состоит в том, чтобы использовать zip() сначала сгруппируйте элементы списков (('A', '1', 'ROM'), ('B', '2', 'MON'), ('C', '3', 'SUN')), как мы желаем, и ключи каждого словаря ('CLIENT', 'ROW', 'KP')).

Затем мы можем использовать понимание списка, перебирая только создал список values и заархивировал его содержимое вместе с кортежем keys, чтобы наконец создать словари, которые будут храниться в списке s

from itertools import chain


d = [{'CLIENT': ['A','B','C']},{'ROW':['1','2','3']},{'KP':['ROM','MON','SUN']}]
keys, *values = zip(*[chain(dict_.keys(), *dict_.values()) for dict_ in d])
s = [dict(zip(keys, tuple_)) for tuple_ in values]

Содержимое s будет :

[
    {'CLIENT': 'A', 'ROW': '1', 'KP': 'ROM'},
    {'CLIENT': 'B', 'ROW': '2', 'KP': 'MON'},
    {'CLIENT': 'C', 'ROW': '3', 'KP': 'SUN'}
]
0 голосов
/ 18 июня 2020

Вручную это будет выглядеть так

S=[{} for i in range(len(d))]
i = 0
for dict in d:
    for k, v in dict.items(): # Always 1
        for value in v:
            S[i][k]=value
            i+=1
        i=0
print(S)
0 голосов
/ 18 июня 2020

Извлеките ключ из каждого словаря и значений, затем zip() их вместе в новый dict():


data = [{'CLIENT': ['A', 'B', 'C']}, {'ROW': ['1', '2', '3']}, {'KP': ['ROM', 'MON', 'SUN']}]

new_keys = [list(d.keys())[0] for d in data]
new_values = zip(*[val for d in data for val in d.values()])

s = [dict(zip(new_keys, val)) for val in new_values]
print(s)

Вывод:

[{'CLIENT': 'A', 'ROW': '1', 'KP': 'ROM'}, 
 {'CLIENT': 'B', 'ROW': '2', 'KP': 'MON'}, 
 {'CLIENT': 'C', 'ROW': '3', 'KP': 'SUN'}]
0 голосов
/ 18 июня 2020

С небольшим обманом, позволив pandas выполнить работу:

Настройка:

from collections import ChainMap
import pandas as pd
d = [{'CLIENT': ['A','B','C']},{'ROW':['1','2','3']},{'KP':['ROM','MON','SUN']}]

Решение:

result = pd.DataFrame(dict(ChainMap(*d))).to_dict(orient='records')

Результат:

[{'KP': 'ROM', 'ROW': '1', 'CLIENT': 'A'},
 {'KP': 'MON', 'ROW': '2', 'CLIENT': 'B'},
 {'KP': 'SUN', 'ROW': '3', 'CLIENT': 'C'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...