sio*_*owy 3 python list-comprehension enumerate
我想做
ls = [myfunc(a,b,i) for a in a_list for b in b_list]
Run Code Online (Sandbox Code Playgroud)
但也传入imyfunc,这是一个从0开始的索引,并为每个新元素递增.
例如:
a_list = 'abc'
b_list = 'def'
Run Code Online (Sandbox Code Playgroud)
应该导致
ls = [myfunc('a','d',0),
myfunc('a','e',1),
myfunc('a','f',2),
myfunc('b','d',3),
myfunc('b','e',4),
...
myfunc('c','f',8]
Run Code Online (Sandbox Code Playgroud)
我知道我可以enumerate()用于正常情况,即.
ls = [myfunc(a,i) for a,i in enumerate(a_list)]
Run Code Online (Sandbox Code Playgroud)
但是,当有两个fors 时,我无法弄清楚如何干净利落地做到这一点.我以前找不到这个问题.
Mar*_*ers 10
您正在两个列表上创建笛卡尔积,因此请使用itertools.product()而不是双for循环.这为您提供了一个可以轻松添加的迭代enumerate():
from itertools import product
ls = [myfunc(a, b, i) for i, (a, b) in enumerate(product(a_list, b_list))]
Run Code Online (Sandbox Code Playgroud)
对于无法使用的情况,您可以product()将多个循环放在生成器表达式中,然后添加enumerate()到该表达式中.假设您需要过滤以下值a_list:
gen = (a, b for a in a_list if some_filter(a) for b in b_list)
ls = [myfunc(a, b, i) for i, (a, b) in enumerate(gen)]
Run Code Online (Sandbox Code Playgroud)
另一种选择是增加一个单独的柜台; itertools.count()为您提供一个计数器对象,用于生成一个新值next():
from itertools import count
counter = count()
ls = [myfunc(a, b, next(counter))
for a in a_list if some_filter(a)
for b in b_list]
Run Code Online (Sandbox Code Playgroud)
毕竟,实质上enumerate(iterable, start=0)相当于zip(itertools.count(start), iterable).
您可以在对序列上使用枚举.
ls = [myfunc(a,b,i) for (i,(a,b)) in
enumerate((a,b) for a in a_list for b in b_list)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |