Вставить и удалить из словаря в цикле - оптимальный метод?

1

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

Теги:
python-3.x
dictionary

2 ответа

0

Вы можете использовать понимание 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

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

  • 0
    Хороший вопрос. Я создаю + удаляю, потому что такие элементы, как attribute_3 : 'foo' также могут быть attribute_3 : 'bar' (и т. Д.), И мне нужно горячее кодирование, чтобы идентифицировать различные параметры текста для attribute_3 как разные вещи. Я отредактирую оригинальный Q, чтобы сделать это более ясным
  • 1
    @Mark_Anderson Я все еще думаю, что нет причин удалять записи, так как вы можете просто установить для них другое значение. И я все еще в замешательстве. Мы говорим, что хотим False для foo и True для bar , или мы просто устанавливаем их все в True ? Вот как я интерпретировал исходную проблему.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню