#we got a list of persons sitting next to each other in a circle. #This means Robby is sitting next to Alice (left) and Valerie (right) for below example. #We want to create a quick lookup dict for who sits next to each other def getCircularLookupDictionary(iter): #generic function which returns a dict of items with format (key, (leftadjacent, rightadjacent)) l = len(iter) """ return dict( (iter[i], (iter[l - 1], iter[i+1]) ) if i == 0 else (iter[i], (iter[i - 1], iter[0]) ) if i == l -1 else (iter[i], (iter[i - 1], iter[i+1]) ) for i in range(l) ) """ #nice oneliner provided by my colleague Ivan Lagunov !! return dict((iter[i], (iter[i - 1], iter[i + 1 - l])) for i in range(l)) circle = ['Robby', 'Valerie', 'Lindsey', 'Audrey', 'Alice'] neighbours = getCircularLookupDictionary(circle) print neighbours['Robby'] print neighbours['Lindsey'] print neighbours['Alice'] assert neighbours['Robby'] == ('Alice', 'Valerie') assert neighbours['Lindsey'] == ('Valerie', 'Audrey') assert neighbours['Alice'] == ('Audrey', 'Robby')

('Alice', 'Valerie') ('Valerie', 'Audrey') ('Audrey', 'Robby')

We can even make it more generic if we want to specify what keys and values to use from the iterables.

#we got a list of persons sitting next to each other in a circle. #This means Robby is sitting next to Alice (left) and Valerie (right) for below example. #We want to create a quick lookup dict for who sits next to each other def getCircularLookupDictionary(iter, keyf, valuef): #generic function which returns a dict of items with format (key, (leftadjacent, rightadjacent)) l = len(iter) """ return dict( (keyf(iter[i]), (valuef(iter[l - 1]), valuef(iter[i+1])) ) if i == 0 else (keyf(iter[i]), (valuef(iter[i - 1]), valuef(iter[0])) ) if i == l -1 else (keyf(iter[i]), (valuef(iter[i - 1]), valuef(iter[i+1])) ) for i in range(l) ) """ #nice oneliner provided by my colleague Ivan Lagunov return dict((keyf(iter[i]), (valuef(iter[i - 1]), valuef(iter[i + 1 -l])) ) for i in range(l)) #circle contains tuples of persons (name, age) circle = [('Robby', 35), ('Valerie', 5), ('Lindsey', 9), ('Audrey', 40), ('Alice', 59)] neighbours = getCircularLookupDictionary(circle, lambda (name,age): name, lambda (name,age): age) print neighbours['Robby'] print neighbours['Lindsey'] print neighbours['Alice'] assert neighbours['Robby'] == (59, 5) #ages of Alice, Valerie assert neighbours['Lindsey'] == (5, 40) #ages of Valerie, Audrey assert neighbours['Alice'] == (40, 35) #ages of Audrey, Robby

(59, 5) (5, 40) (40, 35)

Hey, how about this one-liner:

ReplyDeletereturn dict((iter[i], (iter[i - 1], iter[i + 1 - l])) for i in range(l))

You keep forgetting about negative list indices support in Python: http://www.diveintopython.net/native_data_types/lists.html#odbchelper.negative.example

Yep... i modified the code snippet to show your oneliner which is indeed very nice.

ReplyDelete