[Tutor] __getitem__

Alan Gauld alan.gauld at yahoo.co.uk
Wed Nov 23 05:05:50 EST 2016


On 23/11/16 06:09, monikajg at netzero.net wrote:

> Can you please explain __getitem__? 

__getitem__ is the operator overload for indexing.
It is like the __add__() method which overloads the + operator.
So if you imple,ent __add__() in your class you can add two instances
together using + and Python calls your __add__() method behind the scenes.
In the same way when you index a collection object (with []) Python
calls the __getitem__ method behind the scenes. So for a dictionary
you can access the values of the dictionary by indexing it with a key:

d = {1:2,3:4}
n = d[1]   # calls d.__getitem__(1) resulting in n = 2

> My understanding is that it brings back dictionary's value. 
> Is this correct?

It brings back the value of the provided key.

> If so which value does it bring? 
> Does it look up this value by using a key?

Yes.

> Where is this key specified in  " numbers.__getitem__"   ?

Either by using indexing like numbers[somekey] or by
someone explicitly calling numbers.__getitem__(aKey)

In your example below sorted accesses the values
using the supplied function (which can be any arbitrary
function that accepts an argument and returns a value.)
By providing __getitem__ as the input function sorted
effectively uses the dictionary values.

> The below supposedly brings back dictionary's keys list  sorted by values. 
> But how does it do it?

By making the sort key the value of each dictionary key in turn

> numbers = {'first': 1, 'second': 2, 'third': 3, 'Fourth': 4}
> sorted(numbers, key=numbers.__getitem__)

If you try it at the prompt:

>>> numbers = {'first': 1, 'second': 2, 'third': 3, 'Fourth': 4}
>>> sorted(numbers, key=numbers.__getitem__)
['first', 'second', 'third', 'Fourth']

You see it works. Now try without getitem:

>>> sorted(numbers)
['Fourth', 'first', 'second', 'third']

This is sorted by the keys. Now lets use a different
sort method to get the values:

def getValue(aKey): return numbers[aKey]

This uses the more familiar indexing technique
to retrieve the value for a given key. We can
now use this function with sorted to get the
original result:

>>> sorted(numbers, key = getValue)
['first', 'second', 'third', 'Fourth']


And we can miss out the separate function definition
by using a lambda:

>>> sorted(numbers, key = lambda ky: numbers[ky])
['first', 'second', 'third', 'Fourth']
>>>

But the authors of your example have used __getitem__
directly because it's already available...(and the indexing
technique calls __getitem__ indirectly anyway).

HTH
-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos




More information about the Tutor mailing list