index = [x for x in range(0,81)]
membership_columns = {
'column_0': index[0:81:9]
'column_1': index[1:81:9]
'column_2': index[2:81:9]
'column_3': index[3:81:9]
'column_4': index[4:81:9]
'column_5': index[5:81:9]
'column_6': index[6:81:9]
'column_7': index[7:81:9]
'column_8': index[8:81:9]
}
是否有可能将其融入词典理解中?另外,第1行的列表理解是否必要?我不确定如何将每个键单独转换为列表理解。
答案 0 :(得分:5)
绝对有可能。我建议这样做:
{('column_%d' % i): index[i:81:9] for i in xrange(9)}
第一个列表理解也不是那么需要:
index = range(0,81)
会完成同样的事情。
您还可以使用xranges替换所有列表切片,这只会生成您需要的值。你可以这样做:
{('column_%d' % i): range(i,81, 9) for i in xrange(9)}
因为python中的range函数采用step参数。见the docs.
尽管如此,尽管看起来更优雅,但你确实会在切片方面受到打击,而这种切割可能会因为更大的理解而变得更糟。在这个尺寸下,它并不是很明显:
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