Замена ключей словаря значениями другого словаря

#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]]}