Как преобразовать defaultdict(Set) в defaultdict(list)?

У меня есть defaultdict(Set):

from sets import Set
from collections import defaultdict
values = defaultdict(Set)

Мне нужна функциональность Set при ее создании, чтобы удалить дубликаты. Следующим шагом я хочу сохранить это как json. Поскольку json не поддерживает эту структуру данных, я хотел бы преобразовать структуру данных в defaultdict(list), но когда я пытаюсь:

defaultdict(list)(values)

Я получаю: TypeError: 'collections.defaultdict' object is not callable, как мне сделать преобразование?


person jonalv    schedule 13.05.2016    source источник
comment
from sets import Set — Python теперь имеет улучшенный тип set, который вам не нужно импортировать. Вы должны прекратить использовать старый sets.Set.   -  person user2357112 supports Monica    schedule 13.05.2016


Ответы (3)


Вы можете использовать следующее:

>>> values = defaultdict(Set)
>>> values['a'].add(1)
>>> defaultdict(list, ((k, list(v)) for k, v in values.items()))
defaultdict(<type 'list'>, {'a': [1]})

Конструктор defaultdict принимает default_factory в качестве первого аргумента, за которым может следовать те же аргументы, что и в обычном dict. В этом случае вторым аргументом является выражение генератора, которое возвращает кортежи, состоящие из ключа и значения.

Обратите внимание, что если вам нужно сохранить его только как обычный JSON, dict подойдет:

 >>> {k: list(v) for k, v in values.items()}
 {'a': [1]}
person niemmi    schedule 13.05.2016
comment
jonalv здесь может не понадобиться функциональность defaultdict. Вы можете использовать еще более простое понимание dict: new_values = {k: list(v) for k, v in values.items()} - person Levi Noecker; 13.05.2016

defaultdict(list, values)

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

defaultdict(list, ((k, list(v)) for k, v in values.viewitems()))

Однако в этот момент вам может даже не понадобиться defaultdict:

{k: list(v) for k, v in values.viewitems()}
person user2357112 supports Monica    schedule 13.05.2016
comment
Это оставит каждую существующую запись как set. - person Jared Goguen; 13.05.2016
comment
@JaredGoguen: Да, я был в процессе редактирования, чтобы решить эту проблему. - person user2357112 supports Monica; 13.05.2016

Скажите, что a = set(), и вы уже заполнили его уникальными значениями. Затем при использовании defaultdict вы можете привести его в список: defaultdict(list(a))

person nvergos    schedule 28.02.2017