Получить значения общих ключей в Json формате Python - PullRequest
0 голосов
/ 11 июля 2020

У меня есть список со следующими значениями, где каждое значение - dict; так что в основном это список со значениями в виде словаря

    {'channel_key': 'AMZ', 'channel_desc': 'amazon UK', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]}
    {'channel_key': 'ebay_us', 'channel_desc': 'ebay US', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]}
    {'channel_key': 'tar', 'channel_desc': 'target', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]}
    {'channel_key': 'AMZ', 'channel_desc': 'amazon UK', 'channel_value': [{'date': '2020-03-02', 'price': '100'}]}
    {'channel_key': 'ebay_us', 'channel_desc': 'ebay US', 'channel_value': [{'date': '2020-03-02', 'price': '30'}]}
    {'channel_key': 'tar', 'channel_desc': 'target', 'channel_value': [{'date': '2020-03-02', 'price': '20'}]}
{'channel_key': 'alibaba', 'channel_desc': 'Alibaba', 'channel_value': [{'date': '2020-03-02', 'price': '30'}]}

Я пытаюсь сделать, если совпадение channel_key, а затем добавить поле channel_value. Например, Channel_key 'AMZ' присутствует дважды, поэтому его значение channel_value будет следующим:

'channel_value': [{'date': '2020-03-01', 'price': '10'},{'date': '2020-03-02', 'price': '100'}]

аналогично tar.

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

    {'channel_key': 'AMZ', 'channel_desc': 'amazon UK', 'channel_value': [{'date': '2020-03-01', 'price': '10'},{'date': '2020-03-02', 'price': '100'}]}
    {'channel_key': 'ebay_us', 'channel_desc': 'ebay US', 'channel_value': [{'date': '2020-03-01', 'price': '10'},{'date': '2020-03-02', 'price': '30'}]}
    {'channel_key': 'tar', 'channel_desc': 'target', 'channel_value': [{'date': '2020-03-01', 'price': '10'},{'date': '2020-03-02', 'price': '20'}]}
{'channel_key': 'alibaba', 'channel_desc': 'Alibaba', 'channel_value': [{'date': '2020-03-02', 'price': '30'}]}

1 Ответ

3 голосов
/ 11 июля 2020

Вы можете попробовать следующий код:

def convert(t):
    d = {}
    for x in t:
        channel_key = x['channel_key']
        if channel_key in d:
            d[channel_key]['channel_value'].extend(x['channel_value'])
        else:
            d[channel_key] = x
    return list(d.values())


if __name__ == '__main__':
    t = [
        {'channel_key': 'AMZ', 'channel_desc': 'amazon UK', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]},
        {'channel_key': 'ebay_us', 'channel_desc': 'ebay US', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]},
        {'channel_key': 'tar', 'channel_desc': 'target', 'channel_value': [{'date': '2020-03-01', 'price': '10'}]},
        {'channel_key': 'AMZ', 'channel_desc': 'amazon UK', 'channel_value': [{'date': '2020-03-02', 'price': '100'}]},
        {'channel_key': 'ebay_us', 'channel_desc': 'ebay US', 'channel_value': [{'date': '2020-03-02', 'price': '30'}]},
        {'channel_key': 'tar', 'channel_desc': 'target', 'channel_value': [{'date': '2020-03-02', 'price': '20'}]},
        {'channel_key': 'alibaba', 'channel_desc': 'Alibaba', 'channel_value': [{'date': '2020-03-02', 'price': '30'}]}
    ]

    converted_t = convert(t)

    from pprint import pprint
    pprint(converted_t)

, который печатает

[{'channel_desc': 'amazon UK',
  'channel_key': 'AMZ',
  'channel_value': [{'date': '2020-03-01', 'price': '10'},
                    {'date': '2020-03-02', 'price': '100'}]},
 {'channel_desc': 'ebay US',
  'channel_key': 'ebay_us',
  'channel_value': [{'date': '2020-03-01', 'price': '10'},
                    {'date': '2020-03-02', 'price': '30'}]},
 {'channel_desc': 'target',
  'channel_key': 'tar',
  'channel_value': [{'date': '2020-03-01', 'price': '10'},
                    {'date': '2020-03-02', 'price': '20'}]},
 {'channel_desc': 'Alibaba',
  'channel_key': 'alibaba',
  'channel_value': [{'date': '2020-03-02', 'price': '30'}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...