2010-05-24 65 views
1

我創建了任意數量的實例(使用for循環和範圍)。在將來的某些事件中,我只需要爲其中一個實例更改屬性。什麼是最好的方法來做到這一點?更新一個實例屬性的最有效方法

現在,我正在執行以下操作:
1)管理列表中的實例。
2)遍歷列表中找到一個鍵值。
3)當我在列表中找到正確的對象(即鍵值=我正在查找的值)時,更改我需要更改的任何屬性。

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

這感覺真的效率低下:我基本上遍歷實例的完整列表,甚至通過我只需要在其中的一個更改屬性。

我是否應該將實例引用存儲在更適合隨機訪問的結構中(例如,將字典的KeyValue作爲字典鍵?)在這種情況下,字典是否更有效?我應該使用別的東西嗎?

謝謝,
邁克

回答

1

我應該存儲在一個結構實例的引用更適合隨機訪問(例如字典,鍵值爲字典鍵?)

是的,如果你是從一個鍵映射到一個值(你在這種情況下),這樣一個人通常通過它的密鑰訪問一個元素,然後一個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

至於你提到,你需要保持一個輔助字典與鍵值爲重點和實例(或實例的列表爲他們的屬性,該屬性值)值( s) - 方式效率更高。事實上,沒有比用於這種用途的字典更高效的了。

1

這取決於你的程序的其他需求。如果你對這些對象所做的所有事情都是通過那個特定的鍵值訪問的,那麼當然,字典是完美的。但是,如果您需要保留元素的順序,將它們存儲在字典中將不會那樣做。 (你可以將它們存儲在一個字典和一個列表中,或者可能有一個數據結構在隨機訪問和保存順序之間提供折衷)或者,如果多個對象可以具有相同的鍵值,則不能同時將它們兩個存儲在單個字典中,至少不是直接存儲。 (你可以有一個列表或類似的詞典)

相關問題