Search code examples
pythonkeyedcollection

Keyed Collection in Python?


Is there any equivalent to KeyedCollection in Python, i.e. a set where the elements have (or dynamically generate) their own keys?

i.e. the goal here is to avoid storing the key in two places, and therefore dictionaries are less than ideal (hence the question).


Solution

  • @Mehrdad said:

    Because semantically, it doesn't make as much sense. When an object knows its key, it doesn't make sense to put it in a dictionary -- it's not a key-value pair. It's more of a semantic issue than anything else.

    With this constraint, there is nothing in Python that does what you want. I suggest you use a dict and not worry about this level of detail on the semantics. @Gabi Purcaru's answer shows how you can create an object with the interface you want. Why get bothered about how it's working internally?

    It could be that C#'s KeyedCollection is doing the same thing under the covers: asking the object for its key and then storing the key for fast access. In fact, from the docs:

    By default, the KeyedCollection(Of TKey, TItem) includes a lookup dictionary that you can obtain with the Dictionary property. When an item is added to the KeyedCollection(Of TKey, TItem), the item's key is extracted once and saved in the lookup dictionary for faster searches. This behavior is overridden by specifying a dictionary creation threshold when you create the KeyedCollection(Of TKey, TItem). The lookup dictionary is created the first time the number of elements exceeds that threshold. If you specify –1 as the threshold, the lookup dictionary is never created.