可以压缩成字典理解吗?

Tra*_*tth 1 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]
    }
Run Code Online (Sandbox Code Playgroud)

有可能将其压缩成词典理解吗?另外,第1行的列表理解是否必要?我不确定如何将每个键单独转换为列表理解.

Sla*_*off 5

绝对是可能的.我建议这样做:

{('column_%d' % i): index[i:81:9] for i in xrange(9)}
Run Code Online (Sandbox Code Playgroud)

第一个列表理解也不是那么需要:

index = range(0,81)
Run Code Online (Sandbox Code Playgroud)

会完成同样的事情.

您还可以使用xranges替换所有列表切片,这只会生成您需要的值.你可以这样做:

{('column_%d' % i): range(i,81, 9) for i in xrange(9)}
Run Code Online (Sandbox Code Playgroud)

因为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
Run Code Online (Sandbox Code Playgroud)

显然这里的字符串格式比我想象的要慢.正如martineau所指出的,使用连接可以获得相当大的速度提升:

>>> timeit.timeit("{('column_' + str(i)): range(i,81,9) for i in xrange(9)}", number = 100000)
0.914525032043457
Run Code Online (Sandbox Code Playgroud)

然而,随着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
Run Code Online (Sandbox Code Playgroud)