如何用单次enumerate实现Python嵌套推导式的连续枚举?
嵌套推导式中实现连续枚举的最优方式?
你需要在嵌套推导式中让i从0开始连续取值到len(my_x_list)*len(my_y_list)-1,同时希望用单一推导式且仅调用一次enumerate()。
先看你给出的几种尝试:
- 未实现枚举的基础推导式:
my_list = [my_function(i, x, y) for x in my_x_list for y in my_y_list]
- 嵌套生成器+enumerate的写法:
my_list = [ my_function(i, x, y) for i, (x, y) in enumerate(((x, y) for x in my_x_list for y in my_y_list)) ]
- 索引计算的写法:
len_y_list = len(my_y_list) my_list = [ my_function(m * len_y_list + n, x, y) for m, x in enumerate(my_x_list) for n, y in enumerate(my_y_list) ]
最优实现方式
你想要的单一推导式+单次enumerate调用的需求,有两种简洁的实现:
方式1:使用itertools.product(可读性最优)
借助标准库的itertools.product直接生成x和y的笛卡尔积,再配合enumerate,写法清晰直观:
import itertools my_list = [my_function(i, x, y) for i, (x, y) in enumerate(itertools.product(my_x_list, my_y_list))]
方式2:简化嵌套生成器写法
你最初的嵌套生成器写法其实已经符合要求,只需要去掉一层冗余的括号,就是标准的单一推导式:
my_list = [my_function(i, x, y) for i, (x, y) in enumerate((x, y) for x in my_x_list for y in my_y_list)]
其他方式的问题
- 索引计算的方式不仅不够优雅,还存在局限性:当每个
x对应的y列表长度动态变化时,需要额外维护累计偏移量,代码复杂度会急剧上升,完全不适合这种场景。 - 上面两种推荐的方式都满足你的所有要求:单一推导式结构、仅调用一次
enumerate(),且在动态长度场景下也能正常工作。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

