更新一个实例属性的最有效方法

时间:2010-05-24 04:28:49

标签: python oop list dictionary multiple-instances

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

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

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

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

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

谢谢,
麦克

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

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

  

在这种情况下字典是否更有效?

是的,更多效率更高。字典平均需要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

答案 2 :(得分:1)

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