Как заполнить словарь по совпадающему ключу?

Как заполнить словарь значениями списка по совпадению 1-го элемента списка? Есть исходный словарь:

{'orders': [{'id': '1', 'num': '22', 'prices': []}, {'id': '2', 'num': '33', 'prices': []}]}

и список:

[['22', 'shop1', '$25'], [22, 'shop2', '$35'], ['33', 'shop1', '$100']]

где 1-элемент это число, которое должно соответствовать полю 'num' 1-го словаря. То есть если '22' является значениям ключа 'num', то мы добавляем 2 и 3 элементы списка в ключ 'prices'. На выходе хочется получить:

{'orders': [{'id': '1', 'num': '22', 'prices': ['shop1', '$25', 'shop2', '$35']}, {'id': '2', 'num': '33', 'prices': ['shop1', '$100']}]}

Пытался сделать с помощью вложенного цикла и проверять совпадения, но это очень долго, так как данных очень много, можно ли это сделать как-нибудь иначе, или изначально по-другому задать исходный словарь, чтобы хранить значения 'prices', чтобы потом использовать в api?


Ответы (1 шт):

Автор решения: inquirer

Здесь превратил двумерный список в массив numpy, для удобства и еще он работает быстрее чем обычный массив, более гибок к извлечению элементов. Так же одно значение 22 типа int. Это вы опечатались или специально так сделали? Вы сказали, что использовали вложенный цикл, а значит их у Вас как минимум два. Может, кто и предложит варианты вообще без циклов(у меня он один в две итерации).

import numpy as np
import more_itertools as mit

aaa = {'orders': [{'id': '1', 'num': '22', 'prices': []}, {'id': '2', 'num': '33', 'prices': []}]}
arr = np.array([['22', 'shop1', '$25'], [22, 'shop2', '$35'], ['33', 'shop1', '$100']])


iterable = arr[:, 0]
for i in aaa['orders']:
    index = list(mit.locate(iterable, lambda x: x in i['num']))
    if len(index) < 1:
       continue
    b = arr[index, 1:]
    if len(index) > 1:
        cou = b.shape[0] + b.shape[1]# количество элементов
        yyy = list(b.reshape(cou,))
    else:
        yyy = list(b[0])#если список один
    i['prices'] = yyy

print(aaa)
→ Ссылка