У меня есть dict, который выглядит так:
{attribute_1 : True,
attribute_2 : False,
attribute_3 : 'foo', # Can be one of multiple text options here
attribute_4 : 5,} # Can be one of multiple numerical options here
Мне нужно преобразовать его так, чтобы каждое значение было логическим, давая:
{attribute_1 : True,
attribute_2 : False,
attribute_3_foo : True,
attribute_4_5 : True}
(однократное кодирование для машинного обучения, в случае, если кто-то заботится о том, почему я делаю такую странную вещь. Будет обрабатывать многие, многие такие словари...).
Рабочее решение, которое я нашел, состоит в том, чтобы сделать цикл for через dict для поиска небулевых vals и (1) создать новые записи, затем (2) удалить что-либо с небулевым ключом. Это прекрасно, но, похоже, он неэффективен и память неэффективна, так как мой список - это новый объект в памяти. Есть лучший способ сделать это?
# List loop to insert ('k,v in dict' won't let you add/delete items)
for x in list(sub_d.items()):
if type(x[1]) is not bool:
sub_d[x[0]+'_'+ str(x[1])] = True
del sub_d[x[0]]
PS. Неполадки списков не работают, поскольку я не могу найти способ прокормить в достаточно сложной операции для выполнения этой работы. Плюс я не думаю, что у них будет какая-то эффективность в отношении моего текущего решения?
Вы можете использовать понимание dict
:
d = {k if isinstance(v, bool) else '{}_{}'.format(k, v): bool(v)
for k, v in d.items()}
{'attribute_1': True,
'attribute_2': False,
'attribute_3_foo': True,
'attribute_4_5': True}
Цикл списка для вставки ('k, v in dict' не позволит вам добавлять/удалять элементы)
for x in list(sub_d.items()): if type(x[1]) is not bool: sub_d[x[0]+'_'+ str(x[1])] = True del sub_d[x[0]]
Почему не просто:
for x in dic:
if type(x) is not bool:
dic[x] = True
Нет причин для удаления записей, и это будет работать в O (n) времени, так как dic
является хэш-таблицей.
attribute_3 : 'foo'
также могут бытьattribute_3 : 'bar'
(и т. Д.), И мне нужно горячее кодирование, чтобы идентифицировать различные параметры текста для attribute_3 как разные вещи. Я отредактирую оригинальный Q, чтобы сделать это более яснымFalse
дляfoo
иTrue
дляbar
, или мы просто устанавливаем их все вTrue
? Вот как я интерпретировал исходную проблему.