1

我正在创建任意数量的实例(使用 for 循环和范围)。在将来的某个事件中,我只需要更改其中一个实例的属性。最好的方法是什么?

现在,我正在做以下事情:
1)管理列表中的实例。
2)遍历列表以找到键值。
3)一旦我在列表中找到正确的对象(即键值=我正在寻找的值),更改我需要更改的任何属性。

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

这感觉效率很低:我基本上是在遍历整个实例列表,即使我只需要更改其中一个实例的属性。

我是否应该将实例引用存储在更适合随机访问的结构中(例如,以 KeyValue 作为字典键的字典?)在这种情况下字典是否更有效?我应该使用别的东西吗?

谢谢,
迈克

4

3 回答 3

1

正如您所提到的,您需要保留一个辅助字典,其中键值作为键,实例(或具有该属性值的实例列表)作为值 -有效。事实上,没有什么比字典更有效的了。

于 2010-05-24T04:32:35.630 回答
1

我是否应该将实例引用存储在更适合随机访问的结构中(例如,以 KeyValue 作为字典键的字典?)

是的,如果你从一个键映射到一个值(在这种情况下就是你),这样一个人通常通过它的键访问一个元素,那么一个字典而不是一个列表会更好。

在这种情况下,字典效率更高吗?

是的,它效率更高。字典平均需要 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
于 2010-05-24T04:33:06.737 回答
1

这取决于您的程序的其他需求是什么。如果您对这些对象所做的只是访问具有该特定键值的对象,那么可以肯定,字典是完美的。但是,如果您需要保留元素的顺序,则将它们存储在字典中不会这样做。(您可以将它们存储在字典和列表中,或者可能存在一种数据结构在随机访问和顺序保存之间提供折衷)或者,如果多个对象可以具有相同的键值,那么您不能将它们同时存储在一个字典中,至少不直接存储。(你可以有一个列表或其他东西的字典)

于 2010-05-24T04:45:02.787 回答