Вставить и удалить из словаря в цикле - оптимальный метод? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть диктант, который выглядит следующим образом:

{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}

(one-hotкодирование для машинного обучения, на случай, если кому-то все равно, почему я делаю такие странные вещи. Обрабатывает много-много таких словарей ...).

Я нашел работающее решение - выполнить цикл forДикт для поиска небулевых значений и (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.Понимание списка не работает, так как я не могу найти способ подать достаточно сложную операцию, чтобы выполнить работу.Кроме того, я не думаю, что они получат какой-либо выигрыш в эффективности по сравнению с моим текущим решением?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вы можете использовать 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}
0 голосов
/ 22 сентября 2018

Цикл списка для вставки ('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 является хеш-таблицей.

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