我正在创建任意数量的实例(使用for循环和范围)。在将来的某个事件中,我需要仅为其中一个实例更改属性。最好的方法是什么?
现在,我正在做以下事项:
1)管理列表中的实例
2)遍历列表以找到键值
3)一旦我在列表中找到了正确的对象(即键值=我正在寻找的值),请更改我需要更改的任何属性。
for Instance within ListofInstances:
if Instance.KeyValue == SearchValue:
Instance.AttributeToChange = 10
这感觉非常低效:我基本上遍历整个实例列表,即使我只需要更改其中一个属性。
我是否应该将实例引用存储在更适合随机访问的结构中(例如,使用KeyValue作为字典键的字典?)在这种情况下字典是否更有效?我应该使用其他东西吗?
谢谢,
麦克
答案 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和列表中,或者可能存在一个在随机访问和订单保存之间提供折衷的数据结构)或者,如果多个对象可以具有相同的键值,那么您不能将它们同时存储在一个单独的字典中,至少不是直接存储。 (你可能有一个列表或某事的词典)