Заполнение словаря из вложенного списка

#python #list #dictionary

Вопрос:

Итак, у меня есть список, в который вложен список с парами:

my_list = [[5,8],[5,10],[3,1],[10,18],[10,20],[21,30]

Теперь мне нужен словарь, который принимает первое число в качестве ключа, а затем перечисляет все соответствующие вторые числа в качестве значения: итак {3: [1], 5: [8,10], 10: [18,20], 21: [30]}

У меня уже есть словарь, состоящий из необходимых уникальных и отсортированных ключей с пустыми значениями. Как теперь заполнить этот словарь правильными значениями из списка?

Ответ №1:

 def foo(d, arr):
    for k, v in arr:
        if d.get(k):
            d[k].append(v)
        else:
            d[k] = [v]
            
d = {}
foo(d, my_list)
d
# {5: [8, 10], 3: [1], 10: [18, 20], 21: [30]}
 

Комментарии:

1. d.setdefault(k, []).append(v) может быть, это лучшее решение.

2. Лучше, да, @HampusLarsson, но я думаю, что ОП нужно сначала сосредоточиться на изучении основ.

Ответ №2:

С помощью dict.setdefault этого мы можем динамически создавать внутреннюю структуру внутри нового словаря, не заботясь о том, чтобы проверить key , существует ли уже внутренняя часть словаря или нет:

 my_list = [[5, 8], [5, 10], [3, 1], [10, 18], [10, 20], [21, 30]]

d = {}
for key, value in my_list:
    d.setdefault(key, []).append(value)

print(d) # Output: {5: [8, 10], 3: [1], 10: [18, 20], 21: [30]}
 

Комментарии:

1. Спасибо! Это делает то, что я хотел, и это выглядит так просто.

Ответ №3:

Вы можете достичь этого с помощью map() :

 output = {}
def mapper(elem):
    values = output.get(elem[0], [])
    values.append(elem[1])
    output[elem[0]] = values
    return output

map(mapper, my_list)
 

Как упоминалось @DeepSpace, это решение недопустимо в Python 3.

Комментарии:

1. Это работает (как опубликовано) только на Python 2, который определенно не следует использовать в октябре ’21. В Python 3 печать output после вызова map покажет, что это пустой диктант

2. Можете ли вы объяснить подробнее ? функция map() уже используется в Python 3.10 docs.python.org/3/library/functions.html#map

3. Я не писал , что Python 3 не имеет map , просто этот код работает не так, как ожидалось, поскольку map возвращает ленивый объект, который необходимо повторить, чтобы фактически вызвать переданную функцию. В любом случае, это не лучший вариант использования для map

4. Спасибо за ваше объяснение