Как я могу добавить все значения из кортежа в словарь? - PullRequest
1 голос
/ 01 мая 2020

Скажем, у меня есть список из трех кортежей, и я хочу, чтобы функция добавляла их во вложенный словарь глубиной в два слоя, например:

lst = [('Watermelon', 200, (1,4)), ('Apple', 100, (2, 23)), ('Apple', 120, (1, 33))]

, и я хочу вернуть словарь f, который выглядит как :

f = {'Watermelon': {(1,4): 200}, 'Apple': {(2, 23): 100, (1, 33): 120 }}

Ответы [ 4 ]

3 голосов
/ 01 мая 2020

Это будет работать. Импорт не требуется и более читабелен, чем синтаксис типа понимания.

dictionary = {}
for a, b, c in lst:
    if a not in dictionary:
        dictionary[a] = {}
    dictionary[a][c] = b

EDIT

  1. Согласен с DavidBurke. Понимания действительно интуитивно понятны и читабельны. Они не должны заходить слишком далеко. ;)

Не стесняйтесь вносить исправления. Этот ответ достиг вершины, поэтому он не должен вводить в заблуждение.

2 голосов
/ 01 мая 2020
import collections as co

dd = co.defaultdict(dict)

for item in lst: 
    dd[item[0]].update({item[2]:item[1]}) 

Результат:

In [31]: dd
Out[31]: 
defaultdict(dict,
            {'Watermelon': {(1, 4): 200},
             'Apple': {(2, 23): 100, (1, 33): 120}})
1 голос
/ 01 мая 2020

Простейший синтаксис:

{a: {c: b} for a, b, c in lst}

Это словарное поколение, которое выводит a: {c: b} для каждого элемента в списке, распаковывая их в последовательном порядке как a, b, c.

Это не совсем то, что вы хотите, так как у вас есть общие ключи, которые вы хотите превратить в список. Другие ответы делают это, менее изящно, как они есть и должны быть. Я оставляю это здесь, чтобы помочь любому будущему Гуглеру, у которого нет таких же требований, как у вас.

0 голосов
/ 01 мая 2020
from collections import defaultdict


keys = [name for name, *_ in lst]
vals = [pair for _, *pair in lst]

f = defaultdict(dict)

for key, val in zip(keys, vals):
    f[key].update({val[1]: val[0]})

Результат:

defaultdict(dict,
            {'Watermelon': {(1, 4): 200},
             'Apple': {(2, 23): 100, (1, 33): 120}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...