Не всегда хорошая идея использовать понимание списка, но всегда полезно создать единицу.Давайте рассмотрим ваш код.У вас есть цикл, который должен выводить len(layerList['C'])
элементов и затем выходить.Вы можете использовать itertools.islice
, чтобы получить желаемое количество элементов из генератора.
Вот первая попытка:
import itertools
def generator():
for layer in list(cnn):
if "Conv2d" in str(layer):
yield re.sub(conv_regx, r'\3 \2 \4 \5', str(layer))
print (list(itertools.islice(generator(), len(layerList['C']))))
Но вам не нужно составлять список из cnn
, потому что он уже повторяется.И вам не нужен layer
, а только str(layer)
.Почему не map
каждый элемент от cnn
до str
?
def generator():
for layer in map(str, cnn):
if "Conv2d" in layer:
yield re.sub(conv_regx, r'\3 \2 \4 \5', layer)
Также становится очень легко преобразовать функцию генератора в понимание генератора:
g = (re.sub(conv_regx, r'\3 \2 \4 \5', layer) for layer in map(str, cnn) if "Conv2d" in layer)
И последний однострочный:
g2 = itertools.islice((re.sub(conv_regx, r'\3 \2 \4 \5', layer) for layer in map(str, cnn) if "Conv2d" in layer), len(layerList['C']))
Будет понятнее, если вы выразите re.sub(...)
в функции:
def format_layer(layer):
return re.sub(conv_regx, r'\3 \2 \4 \5', layer)
g = itertools.islice((format_layer(l) for l in map(str, cnn) if "Conv2d" in l), len(layerList['C']))
print (list(g))
Но цикл может быть более простым для понимания и поддержки...