I have a list of lists:
colours=[["#660000","#863030","#ba4a4a","#de7e7e","#ffaaaa"],["#a34b00","#d46200","#ff7a04","#ff9b42","#fec28d"],["#dfd248","#fff224","#eefd5d","#f5ff92","#f9ffbf"],["#006600","#308630","#4aba4a","#7ede7e","#aaffaa"]]
whats the cleanest way of search the list, and returning the position of one of the items, e.g. "#660000"
?
I have looked at the index method, but that doesn't seem to unpack the list inside the list.
postion=colours.index("#660000")
gives: ValueError: ['#660000'] is not in list
, not [0][0]
as I expect...
another thing you can do is selecting the section of the list you want and then use index to find it
I'd do something like this:
This will return a list of tuples where the first index is the position in the first list and second index the position in the second list (note:
c
is the colour you're looking for, that is,"#660000"
).For the example in the question, the returned value is:
If you just need to find the first position in which the colour is found in a lazy way you can use this:
This will return the tuple for the first element found or
None
if no element is found (you can also remove theNone
argument above in it will raise aStopIteration
exception if no element is found).Edit: As @RikPoggi correctly points out, if the number of matches is high, this will introduce some overhead because
colour
is iterated twice to findc
. I assumed this to be reasonable for a low number of matches and to have an answer into a single expression. However, to avoid this, you can also define a method using the same idea as follows:Note that since
find
is a generator you can actually use it as in the example above withnext
to stop at the first match and skip looking further.If you want to evade from iterating the target sublist twice, it seems that the best (and the most Pythonic) way to go is a loop:
Using
enumerate()
you could write a function like this one:In Python 3, I used this pattern:
It would be perhaps more simple using
numpy
:As you see you'll get a tuple with all the row and column indexes.