#python #python-3.x #dictionary
#python #python-3.x #словарь
Вопрос:
У меня есть три словаря:
packed_items = {0: [0, 3],
2: [1],
1: [2]}
trucks_dict = {0: [9.5, 5.5, 5.5],
1: [13.0, 5.5, 7.0],
2: [16.0, 6.0, 7.0]}
items_dict = {0: [4.6, 4.3, 4.3],
1: [4.6, 4.3, 4.3],
2: [6.0, 5.6, 9.0],
3: [8.75, 5.6, 6.6]}
packed_items
состоит из грузовиков в качестве ключей и значений в виде списка элементов. Я хочу изменить свой packed_dict таким образом, чтобы он выдавал мне выходные данные в этом формате
packed_dict = {[9.5, 5.5, 5.5]:[[4.6, 4.3, 4.3],[8.75, 5.6, 6.6]]
[16.0, 6.0, 7.0]:[[4.6, 4.3, 4.3]]
[13.0, 5.5, 7.0]:[[6.0, 5.6, 9.0]]}
В принципе, я хочу заменить свои ключи в packed_items
на значения в trucks_dict
, а значения в packed_items
на значения в items_dict
.
Комментарии:
1. Вы не можете, потому что ключи словаря не могут быть списками.
2. Верно, но можем ли мы передать список в виде строки? Вместо [9.5, 5.5, 5.5] в качестве ключа я могу работать с ‘[9.5, 5.5, 5.5]’
Ответ №1:
Преобразуя ключи вашего списка в кортежи, вы можете сделать это с помощью чего-то вроде:
Код:
result = {}
for k, v in packed_items.items():
for i in v:
result.setdefault(tuple(trucks_dict[k]), []).append(items_dict[i])
Тестовый код:
packed_items = {0: [0, 3],
2: [1],
1: [2]}
trucks_dict = {0: [9.5, 5.5, 5.5],
1: [13.0, 5.5, 7.0],
2: [16.0, 6.0, 7.0]}
items_dict = {0: [4.6, 4.3, 4.3],
1: [4.6, 4.3, 4.3],
2: [6.0, 5.6, 9.0],
3: [8.75, 5.6, 6.6]}
result = {}
for k, v in packed_items.items():
for i in v:
result.setdefault(tuple(trucks_dict[k]), []).append(items_dict[i])
print(result)
Результаты:
{(9.5, 5.5, 5.5): [[4.6, 4.3, 4.3], [8.75, 5.6, 6.6]],
(16.0, 6.0, 7.0): [[4.6, 4.3, 4.3]],
(13.0, 5.5, 7.0): [[6.0, 5.6, 9.0]]
}
Ответ №2:
Вы не можете использовать списки в качестве ключей словаря, потому что они не хэшируются.
Поскольку вы запросили строковые ключи, вы можете сделать:
from collections import defaultdict
packed_items = {0: [0, 3],
2: [1],
1: [2]}
trucks_dict = {0: [9.5, 5.5, 5.5],
1: [13.0, 5.5, 7.0],
2: [16.0, 6.0, 7.0]}
items_dict = {0: [4.6, 4.3, 4.3],
1: [4.6, 4.3, 4.3],
2: [6.0, 5.6, 9.0],
3: [8.75, 5.6, 6.6]}
d = defaultdict(list)
for k1, v1 in trucks_dict.items():
for k2, v2 in items_dict.items():
if k1 == k2 % 3:
d[str(v1)].append(v2)
print(d)
# {'[9.5, 5.5, 5.5]': [[4.6, 4.3, 4.3], [8.75, 5.6, 6.6]], '[16.0, 6.0, 7.0]': [[4.6, 4.3, 4.3]], '[13.0, 5.5, 7.0]': [[6.0, 5.6, 9.0]]}
Комментарии:
1. из коллекций импортируйте defaultdict packed_items = {0: [0,3,1,2]} trucks_dict = {0: [9.5, 5.5, 5.5], 1: [13.0, 5.5, 7.0], 2: [16.0, 6.0, 7.0]} items_dict = {0: [4.6, 4.3, 4.3], 1: [4.6, 4.3, 4.3], 2: [6.0, 5.6, 9.0], 3: [8.75, 5.6, 6.6]} d = defaultdict(список) для k1, v1 в trucks_dict.items(): для k2, v2 в items_dict.items(): если k1 == k2 % 3: d[str(v1)].append(v2) печать(dict(d)) Когда я делаю это, он по-прежнему выдает тот же ответ!
2. @Austin Я думаю, вы только что создали код, который принимает значения, кратные 3, и добавляет к окончательному словарю, что совсем не то, чего хотел запрашивающий! Похоже, вы нашли шаблон (0,3) и дали код, который работает только на грузовиках, кратных 3
Ответ №3:
Вы можете использовать понимание dict для сопоставления списков в trucks_dict
с элементами в items_dict
. Списки должны быть преобразованы в кортежи, чтобы их можно было хэшировать как ключи:
{tuple(trucks_dict[k]): [items_dict[i] for i in l] for k, l in packed_items.items()}
Это возвращает:
{(9.5, 5.5, 5.5): [[4.6, 4.3, 4.3], [8.75, 5.6, 6.6]],
(13.0, 5.5, 7.0): [[6.0, 5.6, 9.0]],
(16.0, 6.0, 7.0): [[4.6, 4.3, 4.3]]}