Эффективный способ работы с двумя списками JSON и их обновления - PullRequest
0 голосов
/ 26 марта 2019

Я хочу работать со списками Python, содержащими JSON, таким образом, чтобы значение key в source_split_response заменялось значением name online_source, где значение onlineId равно значению key в source_split_response.

online_source = [{'_id': {'$oid': '5c989c112ae8570ca8c6bcd1'},
  'name': 'Blogs',
  'onlineId': '606881',
  'type': 'source'},
 {'_id': {'$oid': '5c989c122ae8570ca8c6bcd2'},
  'name': 'Facebook',
  'onlineId': '606911',
  'type': 'source'},
 {'_id': {'$oid': '5c989c122ae8570ca8c6bcd3'},
  'name': 'Instagram',
  'onlineId': '606937',
  'type': 'source'},
 {'_id': {'$oid': '5c989c122ae8570ca8c6bcd4'},
  'name': 'Tumblr',
  'onlineId': '606961',
  'type': 'source'},
 {'_id': {'$oid': '5c989c122ae8570ca8c6bcd5'},
  'name': 'Twitter',
  'onlineId': '606963',
  'type': 'source'},
 {'_id': {'$oid': '5c989c132ae8570ca8c6bcd6'},
  'name': 'Others',
  'onlineId': '606949',
  'type': 'source'},
 {'_id': {'$oid': '5c989c132ae8570ca8c6bcd7'},
  'name': 'Forums',
  'onlineId': '606925',
  'type': 'source'},
 {'_id': {'$oid': '5c989c132ae8570ca8c6bcd8'},
  'name': 'Youtube',
  'onlineId': '606965',
  'type': 'source'}]


source_split_response = [
        {
            "key" : "News", 
            "doc_count" : 20
        }, 
        {
            "key" : "606881",
            "doc_count" : 12
        }, 
        {
            "key" : "606925", 
            "doc_count" : 6
        }
    ]

Код Python:

for ind_source_resp in range(0, len(source_split_response)):
    for ind_source_map in range(0, len(online_source)):
        if(source_split_response[ind_source_resp]['key'] == online_source[ind_source_map]['onlineId']):
            source_split_response[ind_source_resp]['key'] = online_source[ind_source_map]['name']
print(source_split_response)

Отпечатки: [{'key': 'News', 'doc_count': 20}, {'key': 'Blogs', 'doc_count': 12}, {'key': 'Forums', 'doc_count': 6}]

Ожидаемый результат: [{'key': 'News', 'doc_count': 20}, {'key': 'Blogs', 'doc_count': 12}, {'key': 'Forums', 'doc_count': 6}]

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

1 Ответ

1 голос
/ 26 марта 2019

Вы можете сохранить отображение идентификаторов в именах в словаре, чтобы избежать повторения всего массива, чтобы соответствовать им:

idDict = dict()

for entry in online_source:
    idDict[entry['onlineId']] = entry['name']

for entry in source_split_response:
    if entry['key'] in idDict:
        entry['key'] = idDict[entry['key']]

print(source_split_response)

Я не знаю, почему вы хотите понять список, но вот способ:

idDict = {entry['onlineId']:entry['name'] for entry in online_source}

[entry.update({'key': idDict.get(entry['key'], entry['key'])}) for entry in source_split_response]

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