#python #dictionary
#python #словарь
Вопрос:
У меня есть данные в следующей форме (сохраненные в списке)
id, price, date, category
Теперь я в основном хочу разделить элементы на основе категории..
в основном словарь, где ключ — это категория, а остальные данные (id, цена, данные) — это его значения
Я уже создал структуру данных, поэтому позволяет элементу структуры данных иметь указанные выше четыре атрибута (идентификатор, цена, дата, категория)
Итак, в основном я хочу, чтобы словарь был в следующей форме:
{1: [item_1,item_2....], 2:[item....]}
как мне это сделать..
Поскольку в одном ключе много значений, следовательно, я знаю, что он будет использовать defaultdict .. но все же я не могу обойти это.
Спасибо
Комментарии:
1. Я не совсем понимаю вашу проблему. почему python dict не работает для вас?
Ответ №1:
Я думаю, вам нужно что-то подобное, предполагая, что ваши текущие данные хранятся в списке list_data
:
dict_data = defaultdict(list)
for item in list_data:
dict_data[item.category].append(item)
Если каждый элемент является кортежем, а не объектом, используйте item[3]
вместо item.category
.
Ответ №2:
output = defaultdict(list)
for item, cat in ((x[:-1], x[-1]) for x in data):
output[cat].append(item)
или, без defaultdict:
output = {}
for item, cat in ((x[:-1], x[-1]) for x in data):
output.setdefault(cat, []).append(item)
Пример вывода:
>>> data = [
... (1, 123, "somedate", "boy"),
... (3, 435, "anotherdate", "boy"),
... (23, 123, "moredate", "girl"),
... ]
>>> output = {}
>>> for item, cat in ((x[:-1], x[-1]) for x in data):
... output.setdefault(cat, []).append(item)
...
>>> print output
{'boy': [(1, 123, 'somedate'), (3, 435, 'anotherdate')], 'girl': [(23, 123, 'moredate')]}
Ответ №3:
Одним из способов сделать это было бы иметь словарь, где каждое значение представляет собой список элементов (идентификатор, цена, дата), а ключ — категория.
Что-то вроде следующего, где d
является словарем, c
является категорией и itm
является кортежем / элементом:
def insert(d, c, itm):
if not c in d:
d[c] = [itm]
else:
d[c].append(itm)