Absolutely it's possible. I would suggest doing this like so:
{('column_%d' % i): index[i:81:9] for i in xrange(9)}
Also the first list comprehension is not quite needed as just doing:
index = range(0,81)
would accomplish the same thing.
You could also replace all of the list slicing with xranges, which are only going to generate your needed values. You could do that like so:
{('column_%d' % i): range(i,81, 9) for i in xrange(9)}
since the range function in python takes a step parameter. See the docs.
That said, despite this looking more elegant, you do take a performance hit over slicing that will probably get worse with larger comprehensions. At this size it's not really noticeable:
import timeit
>>> timeit.timeit("{('column_%d' % i): range(i,81, 9) for i in xrange(9)}", number = 100000)
1.3790168762207031
>>> timeit.timeit("index=range(0,81);{('column_%d' % i): index[i:81:9] for i in xrange(9)}", number = 100000)
1.1949927806854248
Apparently the string formatting here is slower than I thought. As pointed out by martineau you can get a considerable speed increase using concatenation instead:
>>> timeit.timeit("{('column_' + str(i)): range(i,81,9) for i in xrange(9)}", number = 100000)
0.914525032043457
However with larger values of i
it starts to become considerable:
>>> timeit.timeit("{('column_%d' % i): range(i,81, 9) for i in xrange(90)}", number = 100000)
12.220430135726929
>>> timeit.timeit("index=range(0,81);{('column_%d' % i): index[i:81:9] for i in xrange(90)}", number = 100000)
9.669343948364258
>>> timeit.timeit("index=range(0,81);{('column_' + str(i)): index[i:81:9] for i in xrange(90)}", number = 100000)
7.163957118988037