#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. Спасибо за ваше объяснение