绝对有可能。我建议这样做:
{('column_%d' % i): index[i:81:9] for i in xrange(9)}
此外,第一个列表理解并不像刚做的那样需要:
index = range(0,81)
会完成同样的事情。
您还可以用 xrange 替换所有列表切片,这只会生成您需要的值。你可以这样做:
{('column_%d' % i): range(i,81, 9) for i in xrange(9)}
因为 python 中的 range 函数需要一个 step 参数。请参阅文档。
也就是说,尽管这看起来更优雅,但您确实会在切片方面受到性能打击,如果理解更大,切片可能会变得更糟。在这个尺寸下,它并不是很明显:
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
显然这里的字符串格式比我想象的要慢。正如 martineau 所指出的,您可以使用串联来显着提高速度:
>>> timeit.timeit("{('column_' + str(i)): range(i,81,9) for i in xrange(9)}", number = 100000)
0.914525032043457
然而,随着它的值越大,i
它开始变得相当可观:
>>> 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