Maybe using list.count() you can achieve the same with less lines?
x = [1,1,2,3,1,3]
def times_so_far(ls):
out = [0]*len(ls)
for i in xrange(len(ls)):
out[i] = ls[:i].count(ls[i])
return out
This can be written with list comprehension as mentioned by Caridorc, and it removes the first len(ls)
call this way (though maybe at the cost of resizing out
for every element of the list):
def times_so_far(ls):
return [ls[:i].count(ls[i]) for i in xrange(len(ls))]
Now, if you're going to work with lists of positive integers of a small value, I would recommend the following, as it's similar to yours but it works with indices instead of dict keys:
def times_so_far(ls, maxValue):
temp = [0]*maxValue
out = [0]*len(ls)
for i in xrange(len(ls)):
out[i] = temp[ls[i]]
temp[ls[i]] += 1
return out