0

Добавление значений в списки в словаре Python

12

Являюсь новичком в 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'?

  1. Как корректно добавить число в drug_dictionary?
  2. Как впоследствии пройтись по всем записям для каждого лекарства?

Заранее благодарен за помощь!

5 ответ(ов)

0

В вашем коде вы можете использовать метод 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 вы легко можете добавлять элементы в список, который уже находится в словаре.

0

Вы должны использовать метод 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']
0

Если вы хотите добавить элементы к спискам, которые находятся по ключам в словаре, вы можете использовать оператор +=, чтобы добавить новые значения к ним (тестировалось в 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 позволит вам добавлять элементы к спискам в словаре без создания лишних объектов, что может быть полезно для оптимизации вашего кода.

0

Вы также можете использовать метод update() для обновления словаря. Вот пример:

d = {"a": 2}
d.update({"b": 4})
print(d)  # {"a": 2, "b": 4}

В данном случае, метод update() добавляет новую пару ключ-значение в словарь d, результатом чего становится словарь с двумя элементами.

0

Похоже, вы пытаетесь настроить словарь, где каждая ценность является списком списков. Ваше начальное значение для каждого препарата в словаре — это []. Поэтому, если у вас есть list1, который вы хотите добавить к списку для 'MORPHINE', вам нужно сделать следующее:

drug_dictionary['MORPHINE'].append(list1)

Теперь вы можете получить доступ к различным спискам так, как вам нужно, например, drug_dictionary['MORPHINE'][0] и т.д.

Чтобы пройтись по спискам, сохраненным под ключом, вы можете сделать так:

for listx in drug_dictionary['MORPHINE']:
    # выполняем какие-то действия с listx
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь