1
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 行的列表理解是否必要?我不确定如何将每个键本身变成列表理解。

4

1 回答 1

5

绝对有可能。我建议这样做:

{('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
于 2014-01-08T00:21:30.077 回答