Как поменять местами два ключа + значения в списке словарей json, используя python? - PullRequest
0 голосов
/ 19 мая 2019

У меня есть файл json с тысячами документов, это вложенные документы, где мне нужно поменять местами позицию в списке из двух пар ключ-значение. Каждый документ выглядит так:

{'DataColeta': '2019-01-02',
'GrupoProduto': 'Etanol',
'Produto': 'ETANOL HIDRATADO COMUM',
'Posto': {'razaosocial': 'POSTO DE GASOLINA N S DA PENHA LTDA',
'CNPJ': '33.267.816/0001-35',
'Distribuidora': 'IPIRANGA PRODUTOS DE PETRÓLEO S.A',
'endereco': 'AVENIDA BRAZ DE PINA,253',
'complemento': '',
'bairro': 'PENHA',
'Latitude': -22.84026333,
'Longitude': -43.281765},
'Ensaios': {'Cor': {'Resultado': 'Incolor', 'Unidade': '', 'Conforme':        'Sim'},
'Aspecto': {'Resultado': 'Límpido e isento de impurezas (LII)',
'Unidade': '',
'Conforme': 'Sim'},
'Condutividade Elétrica': {'Resultado': '97',
'Unidade': 'µS/m',
'Conforme': 'Sim'},
'Massa Específica a 20°C': {'Resultado': '809.8',
'Unidade': 'kg/m³',
'Conforme': 'Sim'},
'Teor Alcoólico': {'Resultado': '93.0',
'Unidade': '% massa',
'Conforme': 'Sim'},
'Potencial Hidrogeniônico (pH)': {'Resultado': '6.8',
'Unidade': '',
'Conforme': 'Sim'},
'Teor de Hidrocarbonetos': {'Resultado': 'Não detectado',
'Unidade': '',
'Conforme': 'Sim'}},
'UF': 'RJ',
'municipio': 'RIO DE JANEIRO',
'id_amostra': '463328'}

Пары ключ-значение, которые я хочу поменять местами, - это долгота и широта, поэтому я могу выполнить геопространственный запрос в MongoDB. Он должен идти с долготой перед широтой в списке.

Файл json называется: "amostras"

Встроенное поле, которое я хочу изменить, - «Пост», и я попытался сделать это: «» 'Питона amostras [я] [ "Posto"]. клавиши ()

dict_keys(['razaosocial', 'CNPJ', 'Distribuidora', 'endereco',               'complemento', 'bairro', 'Latitude', 'Longitude'])


def swapPositions(list, pos1, pos2): 

    list[pos1], list[pos2] = list[pos2], list[pos1] 
    return list

List = list(amostras[i]["Posto"].keys())
pos1, pos2 = 6, 7
for i in range(len(amostras)):
    swapPositions(List, pos1+1, pos2-1)

'' '

Но всегда выдает ошибку:

Объект dict_keys не может быть вызван

1 Ответ

0 голосов
/ 20 мая 2019

После версии 3.6 Python диктует порядок пар ключ-значение путем вставки. Так что если вы переписываете свою функцию как:

def order_geodata(doc):
    latitude, longitude = doc['Latitude'], doc['Longitude']
    del doc['Latitude']
    del doc['Longitude']
    doc['Longitude'] = longitude
    doc['Latitude'] = latitude

Он установит параметры геоданных в желаемом порядке в конце указания, используемого в качестве цели order_geodata ().

Убедитесь, что все целевые jsons будут иметь ключи «Долгота» и «Широта». В противном случае вам потребуется изменить прямую индексацию dict на форму dict.get ('key'), чтобы избежать ошибок в цикле.

...