2014-01-08 1 views
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? Я не был уверен, как я превращаю каждый ключ в понимание списка сам по себе.Можно сжать в понимание словаря?

ответ

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 принимает параметр шага. См. 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 

Очевидно, форматирование строки здесь медленнее, чем я думал. Как отметил Мартино вы можете получить значительное увеличение скорости с помощью конкатенации вместо:

>>> 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 
+0

Большое спасибо. Последующий вопрос: строго ли требуется нарезка индекса, или есть ли понимание списка, которое будет делать то же самое? – TravMatth

+1

@TravM на самом деле, вы можете напрямую использовать диапазон для такого рода вещей. См. Обновленный ответ. –

+1

Эффект, связанный с разрезанием, уравновешен, не тратя все пространство на создание массива индексов, и в _very_ больших размерах понимание, вероятно, снова начнет расти быстрее, потому что вы также избегаете всех этих промахов в кеше (и, при действительно больших размерах, страницы промахов). Но в любом случае, я думаю, вы правы, что элегантность, вероятно, важнее производительности здесь. – abarnert

 Смежные вопросы

  • Нет связанных вопросов^_^