Использование списка понимания для печати преобразованной строки? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытался использовать списочное понимание, чтобы упростить этот код:

c = 0
conv_regx = r'(Conv2d).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*'
for layer in list(cnn):
     if "Conv2d" in str(layer):
         print(re.sub(conv_regx, r'\3 \2 \4 \5', str(layer)))
         c+=1
     if c == len(layerList['C']):
         break

Но мои попытки приводят к ошибкам:

conv_regx = r'(Conv2d).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*?(\d+).*'
print_name = [str(re.sub(conv_regx, r'\3 \2 \4 \5', str(i))) if "Conv2d" in str(i) for i in list(cnn)]

Как эта ошибка:

    print_name = [str(re.sub(conv_regx, r'\3 \2 \4 \5', str(i))) if "Conv2d" in str(i) for i in list(cnn)]
                                                                                         ^
SyntaxError: invalid syntax

Как правильно использовать списочное понимание для этой задачи?

Редактировать:

Я исправил for и если перепутал, но как мне напечатать строку?

[print(str(re.sub(conv_regx, r'\3 \2 \4 \5', str(i)))) for i in list(cnn) if "Conv2d" in str(i) ]


    [print(str(re.sub(conv_regx, r'\3 \2 \4 \5', str(i)))) for i in list(cnn) if "Conv2d" in str(i) ]
         ^
SyntaxError: invalid syntax

1 Ответ

0 голосов
/ 11 мая 2018

Не всегда хорошая идея использовать понимание списка, но всегда полезно создать единицу.Давайте рассмотрим ваш код.У вас есть цикл, который должен выводить 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))

Но цикл может быть более простым для понимания и поддержки...

...