Самый эффективный способ обновить атрибут одного экземпляра - PullRequest
1 голос
/ 24 мая 2010

Я создаю произвольное количество экземпляров (используя для циклов и диапазонов).На каком-то событии в будущем мне нужно изменить атрибут только для одного экземпляра.Какой лучший способ сделать это?

Сейчас я делаю следующее:
1) Управление экземплярами в списке.
2) Итерация по списку для поиска значения ключа.
3) Как только я найду нужный объект в списке (т.е. значение ключа = значение, которое я ищу), измените любой атрибут, который мне нужно изменить.

for Instance within ListofInstances:
    if Instance.KeyValue == SearchValue:
        Instance.AttributeToChange = 10

Это кажется действительно неэффективным: я в основном перебираю весь список экземпляров, даже если мне нужно только изменить атрибут в одном из них.

Должен ли я хранитьссылки на экземпляры в структуре, более подходящей для произвольного доступа (например, словарь с KeyValue в качестве ключа словаря?) Является ли словарь более эффективным в этом случае?Должен ли я использовать что-то еще?

Спасибо,
Майк

Ответы [ 3 ]

1 голос
/ 24 мая 2010

Должен ли я хранить ссылки на экземпляры в структуре, более подходящей для произвольного доступа (например, словарь с KeyValue в качестве ключа словаря?)

Да, если вы сопоставляете с ключомк значению (которым вы в данном случае), так что обычно к элементу обращаются через его ключ, тогда лучше dict , чем список.

Является лисловарь в этом случае более эффективен?

Да, он намного эффективнее .Словарь использует O (1) в среднем для поиска элемента по его ключу, в то время как список использует O (n) для поиска элемента по его ключу, что вы сейчас делаете.

Использованиесловарь

 # Construct the dictionary
 d = {}

 # Insert items into the dictionary
 d[key1] = value1
 d[key2] = value2
 # ...

 # Checking if an item exists
 if key in d:
      # Do something requiring d[key]
      # such as updating an attribute:
      d[key].attr = val
1 голос
/ 24 мая 2010

Это зависит от других потребностей вашей программы.Если все, что вы когда-либо делаете с этими объектами, это доступ к объекту с этим конкретным значением ключа, то, конечно, словарь идеален.Но если вам нужно сохранить порядок элементов, сохранение их в словаре не сделает этого.(Вы можете хранить их как в файле dict, так и в списке, или может существовать структура данных, обеспечивающая компромисс между произвольным доступом и сохранением порядка). Альтернативно, если несколько объектов могут иметь одно и то же значение ключа, вы не сможетехраните их обоих одновременно, по крайней мере, не напрямую.(Вы можете иметь список списков или что-то в этом роде)

1 голос
/ 24 мая 2010

Как вы упоминаете, вам нужно сохранить вспомогательный словарь со значением ключа в качестве ключа и экземпляр (или список экземпляров с этим значением для их атрибута) в качестве значения (й) - way более эффективным. Действительно, нет ничего более эффективного, чем словарь для таких целей.

...