Добавление значений в списки в словаре Python
Являюсь новичком в Python и столкнулся с проблемой при работе со словарем, в который хочу добавлять списки чисел для каждого лекарства. Вот что у меня есть:
def make_drug_dictionary(data):
drug_dictionary = {
'MORPHINE': [],
'OXYCODONE': [],
'OXYMORPHONE': [],
'METHADONE': [],
'BUPRENORPHINE': [],
'HYDROMORPHONE': [],
'CODEINE': [],
'HYDROCODONE': []
}
prev = None
for row in data:
if prev is None or prev == row[11]:
drug_dictionary[row[11]].append(row[0]) # Здесь я пытаюсь добавить число
prev = row[11]
return drug_dictionary
Сначала, мне необходимо понять, как правильно добавлять числа в словарь drug_dictionary
по ключу лекарства.
Во-вторых, как мне потом получить доступ ко всем записям для конкретного лекарства,например, к 'MORPHINE'?
- Как корректно добавить число в
drug_dictionary
? - Как впоследствии пройтись по всем записям для каждого лекарства?
Заранее благодарен за помощь!
5 ответ(ов)
В вашем коде вы можете использовать метод append
, чтобы добавлять списки в словарь. Вот пример:
list1 = [1, 2, 3, 4, 5]
list2 = [123, 234, 456]
d = {'a': [], 'b': []}
d['a'].append(list1)
d['a'].append(list2)
print(d['a'])
В результате выполнения кода, переменная d['a']
будет содержать оба списка. Если вы запустите этот код, вы получите следующий вывод:
[[1, 2, 3, 4, 5], [123, 234, 456]]
Таким образом, с помощью append
вы легко можете добавлять элементы в список, который уже находится в словаре.
Вы должны использовать метод append
для добавления элементов в список. Также вот несколько советов по коду:
Я бы использовал dict.setdefault
или defaultdict
, чтобы избежать необходимости указывать пустой список при определении словаря.
Если вы используете prev
, чтобы отфильтровать дубликаты, вы можете упростить код, используя groupby
из модуля itertools
. Ваш код с внесёнными поправками будет выглядеть следующим образом:
import itertools
def make_drug_dictionary(data):
drug_dictionary = {}
for key, row in itertools.groupby(data, lambda x: x[11]):
drug_dictionary.setdefault(key, []).append(row[?])
return drug_dictionary
Если вы не знаете, как работает groupby
, просто посмотрите этот пример:
>>> list(key for key, val in itertools.groupby('aaabbccddeefaa'))
['a', 'b', 'c', 'd', 'e', 'f', 'a']
Если вы хотите добавить элементы к спискам, которые находятся по ключам в словаре, вы можете использовать оператор +=
, чтобы добавить новые значения к ним (тестировалось в Python 3.7):
mydict = {'a': [], 'b': []}
print(mydict)
mydict['a'] += [1, 3]
mydict['b'] += [4, 6]
print(mydict)
mydict['a'] += [2, 8]
print(mydict)
На выходе получите:
{'a': [], 'b': []}
{'a': [1, 3], 'b': [4, 6]}
{'a': [1, 3, 2, 8], 'b': [4, 6]}
Также можно использовать метод extend
, который делает то же самое, но без создания нового списка (более эффективный способ):
mydict['a'].extend([1, 3])
Таким образом, extend
позволит вам добавлять элементы к спискам в словаре без создания лишних объектов, что может быть полезно для оптимизации вашего кода.
Вы также можете использовать метод update()
для обновления словаря. Вот пример:
d = {"a": 2}
d.update({"b": 4})
print(d) # {"a": 2, "b": 4}
В данном случае, метод update()
добавляет новую пару ключ-значение в словарь d
, результатом чего становится словарь с двумя элементами.
Похоже, вы пытаетесь настроить словарь, где каждая ценность является списком списков. Ваше начальное значение для каждого препарата в словаре — это []
. Поэтому, если у вас есть list1
, который вы хотите добавить к списку для 'MORPHINE'
, вам нужно сделать следующее:
drug_dictionary['MORPHINE'].append(list1)
Теперь вы можете получить доступ к различным спискам так, как вам нужно, например, drug_dictionary['MORPHINE'][0]
и т.д.
Чтобы пройтись по спискам, сохраненным под ключом, вы можете сделать так:
for listx in drug_dictionary['MORPHINE']:
# выполняем какие-то действия с listx
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?