Как заполнить словарь по совпадающему ключу?
Как заполнить словарь значениями списка по совпадению 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 шт):
Здесь превратил двумерный список в массив 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)