可以压缩成字典理解吗?

时间:2014-01-08 00:19:11

标签: python list-comprehension dictionary-comprehension

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行的列表理解是否必要?我不确定如何将每个键单独转换为列表理解。

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