簡體   English   中英

如何用兩個'for'列舉列表理解?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM