有没有办法可以缩短这个列表理解?

时间:2017-03-28 08:07:06

标签: python list python-3.x list-comprehension

你能帮我缩短这个涉及列表推导的python代码吗?在我当前的代码中,未使用变量e_col。我还不知道如何利用这个e_col变量。这是代码:

e_rows = (10,34)
e_col = (4,6,8,10,13,15,17,19)
inst = 'A'

test_list = [inst+'_r'+str(e_rows[0])+'c'+str(i) for i in range(4,12,2)]
test_list.extend([inst+'_r'+str(e_rows[0])+'c'+str(i) for i in range(13,21,2)])
test_list.extend([inst+'_r'+str(e_rows[1])+'c'+str(i) for i in range(4,12,2)])
test_list.extend([inst+'_r'+str(e_rows[1])+'c'+str(i) for i in range(13,21,2)])

print(test_list)

当我运行此代码时,它返回:

['A_r10c4', 'A_r10c6', 'A_r10c8', 'A_r10c10', 'A_r10c13', 'A_r10c15', 'A_r10c17', 'A_r10c19', 'A_r34c4', 'A_r34c6', 'A_r34c8', 'A_r34c10', 'A_r34c13', 'A_r34c15', 'A_r34c17', 'A_r34c19']

我也研究过itertools.product,但我无法理解它是如何运作的。

2 个答案:

答案 0 :(得分:6)

您的元素的基本结构似乎是:

'A_r{}c{}'  # {} are the placeholders for str.format

然后你只需要行号和列号,itertools.product肯定是一个不错的选择:

from itertools import product

test_list = ['A_r{}c{}'.format(row, col) for row, col in product(e_rows, e_col)]

它给出了相同的输出:

>>> test_list
['A_r10c4', 'A_r10c6', 'A_r10c8', 'A_r10c10', 'A_r10c13', 'A_r10c15', 'A_r10c17', 'A_r10c19', 'A_r34c4', 'A_r34c6', 'A_r34c8', 'A_r34c10', 'A_r34c13', 'A_r34c15', 'A_r34c17', 'A_r34c19']

不清楚为什么使用两个range而不仅仅是e_col

答案 1 :(得分:1)

列表理解可以做"产品"嵌套循环,纯Python,没有库

test_list = [inst+'_r'+str(j)+'c'+str(i) for j in e_rows for i in e_col]