2016-12-30 7 views
1

У меня есть дело, как это:Что такое Python List Понимание этого вложенного цикла?

#!/usr/bin/python2.7 
y = [[0 for i in xrange(size_of_array)] for j in xrange(size_of_array)] 

offset_flag = 0 

for i in xrange(size_of_array): 
    for j in xrange(size_of_array): 
     y[i][j] = starting_no + j + offset_flag 
    offset_flag += j + 1 

Я хочу, чтобы список понимание вложенных для цикла, но также он должен обрабатывать случай, как следует:

offset_flag += j + 1 

Как я могу достичь такого рода понимания списка?

+9

Понимание этого списка не будет таким же читаемым, как ваш текущий подход, учитывая обновление 'offset_flag' –

+1

. Кроме того, понимание списка не обязательно означает более быстрый код – ForceBru

+0

' [[start_no + j + (i * size_of_array) + i для j в xrange (size_of_array)] для i в xrange (size_of_array)] 'обратите внимание, что' j + 1' всегда 'size_of_array' –

ответ

1

весь Ваш код может быть заменен:

# Changing variables for cleaner expression: 
# size_of_array -> s_a 
# starting_no -> start 

y = [[start + j + (i*s_a) for j in xrange(s_a)] for i in xrange(s_a)] 
1

Просто используйте умножение вместо того, чтобы вычислить ваше смещение:

y = [[starting_no + j + (i * size_of_array) for j in xrange(size_of_array)] 
    for i in xrange(size_of_array)] 

который можно записать чуть более сжато, используя более короткие имена переменных:

start, size = starting_no, size_of_array 
y = [[start + j + (i * size) for j in xrange(size)] for i in xrange(size)] 

Ваше offset значение не более, чем i * size_of_array здесь; каждая итерация внешней петли вы добавляете j + 1, но j - всегда будет установлен в size_of_array - 1. Замените j на номер size_of_array - 1, и вы получите offset += size_of_array. Первая итерация - 0, затем 1 * size_of_array, вплоть до (size_of_array - 1) * size_of_array, следуя переменной i.

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

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