2016-12-30 66 views
1

我情況是這樣的:什麼是這個嵌套循環的Python列表理解?

#!/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 

我想要的嵌套for循環列表理解,而且它像下面應處理情況:

offset_flag += j + 1 

我如何能達到這種列表理解的?

+9

此列表內涵幾乎不會因爲你目前的做法是可讀的,考慮到'offset_flag'更新 –

+1

此外,列表理解並不一定意味着更快的代碼 – ForceBru

+0

'[starting_no + J +(I * size_of_array)+ i for x inrange(size_of_array)] for i in 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變量之後。