[英]How do I enumerate a list comprehension with two 'for's?
我想做
ls = [myfunc(a,b,i) for a in a_list for b in b_list]
但也將i
傳入myfunc,這是一個從0開始的索引,並為每個新元素遞增。
例如:
a_list = 'abc'
b_list = 'def'
應該導致
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]
我知道我可以使用enumerate()
來表示正常情況,即。
ls = [myfunc(a,i) for a,i in enumerate(a_list)]
但我無法弄清楚如何做到這一點干凈的時候有兩個for
秒。 我以前找不到這個問題。
您正在兩個列表上創建笛卡爾積 ,因此請使用itertools.product()
而不是double for
循環。 這為您提供了一個可迭代的,您可以輕松地將enumerate()
添加到:
from itertools import product
ls = [myfunc(a, b, i) for i, (a, b) in enumerate(product(a_list, b_list))]
對於無法使用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)]
另一種選擇是增加一個單獨的櫃台; 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]
畢竟,實質上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)]
對於一個簡單的嵌套循環,請使用itertools.product()
作為@Martijn建議。
如果表達式更復雜,可以使用itertools.count
:
i_gen = itertools.count()
ls = [myfunc(a, b, next(i_gen)) for a in a_list for b in b_list]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.