Добавление значений в словарь в Python - PullRequest
1 голос
/ 17 января 2012

Я смотрю на самый умный способ использования словаря для обработки некоторых данных. У меня есть уникальный ключ, который будет ассоциировать его с другими значениями, поэтому, например, у нас есть 1: [2, 3, 4, 7], 2: [8, 9, 5]. Что я хотел бы сделать, так это уметь добавлять значения так, чтобы для первого ключа я мог добавить число 13 и получить следующее:

1:[2, 3, 4, 7, 13], 2:[8, 9, 5]

Добавить не кажется самым умным способом сделать это. Я использую:

dict[master = dict[master].append(id)

но я получаю следующее:

AttributeError: у объекта 'int' нет атрибута 'append'

Теперь я могу просто взять предыдущие значения ключа и просто сделать следующее (id = 17):

newvalue = значения, id

но это приведет к дополнительным скобкам, таким как

1:[[2, 3, 4, 7, 13], 17] 

Какой самый разумный способ обеспечить, чтобы я получал числа только в одном наборе скобок, т.е.

1:[2, 3, 4, 7, 13, 17] 

Я мог бы использовать некоторые функции зачистки - но есть ли хороший и простой способ сделать это. Я мог бы пропустить что-то простое здесь. Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 17 января 2012

Используйте collections.defaultdict (и, wottthehell, сделайте каждую запись collections.deque просто для удовольствия; вы также можете использовать простой старый list, конечно).

from collections import defaultdict, deque

d = defaultdict(deque)   # or ...(list)

d[1].append(2)
d[1].extend([3, 4, 7, 13])

Основная идея здесь заключается в том, что значения вашего словаря всегда deque с, и вы всегда добавляете их, так что вам никогда не придется беспокоиться о том, является ли значение int. Если вы используете ключ, которого нет в словаре, defaultdict автоматически создаст для вас новый deque, поэтому вам никогда не придется проверять, существует ли ключ в словаре.

Если у вас уже есть обычный словарь с одиночными значениями int - скажем, это было возвращаемое значение для некоторой вызванной вами функции - вы можете просто использовать этот dict для создания новой, прежде чем использовать ее для чего угодно делаешь с этим.

d = defaultdict(deque)
for key, value in old_d.iteritems():
    d[key].append(value)
4 голосов
/ 17 января 2012

Списки изменчивы. Просто поменяйте его на место.

dict[master].append(id)
1 голос
/ 17 января 2012

(1) Создайте класс, чтобы обернуть это (еще лучше, используйте defaultdict(deque) вместо dict, как предлагает @kindall; вам нужен новый класс, только если вам нужно больше, чем дает)

(2) Используйте deque в качестве значения для каждой записи в вашем dict, даже пустых или однозначных записей, и добавляйте к этой деке. deque предназначен для добавления постоянного времени на обоих концах; list на самом деле вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...