【问题标题】:Is there a way I can shorten this list comprehension?有没有办法可以缩短这个列表理解?
【发布时间】:2017-03-28 08:07:06
【问题描述】:

你能帮我缩短这个涉及列表推导的 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,但我不明白它是如何工作的。

【问题讨论】:

  • 你能描述一下这里实际发生了什么吗?这样做的目的是什么?
  • 我得到了我想要的结果列表,就像我在上面的描述中显示的那样。我想缩短代码并利用 e_col 元组

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


【解决方案1】:

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

'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']

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

【讨论】:

  • 感谢您的回答和一个班轮代码。然而,在实际应用中,结果列表中的A 也是一个变量(即inst)。我如何修改您的答案以考虑到这一点?
  • @Meeyaw 这是一个非常简单的调整,我相信你可以在没有进一步帮助的情况下完成它。
  • 好的。顺便谢谢。是的,我知道如何调整它。再次感谢。
【解决方案2】:

列表推导可以用嵌套循环、纯 Python、没有库来做“产品”

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

【讨论】:

  • 谢谢。你的这个在代码中非常整洁。
猜你喜欢
  • 2022-01-05
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2020-11-17
  • 2021-08-20
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多