使用list comprehension打印转换后的字符串?

时间:2018-04-25 22:57:14

标签: python list-comprehension

我一直在尝试使用列表推导来简化此代码:

-k1

但我的尝试导致错误:

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)]

如何正确使用列表理解来完成此任务?

编辑:

我修复了for和if混合,但是如何打印字符串?

    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

1 个答案:

答案 0 :(得分:0)

使用列表理解并不总是一个好主意,但它总是一个 良好的锻炼创造一个。我们来检查您的代码。你有一个循环 应输出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每一个元素 cnnstr

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))

但循环可能更容易理解和维护......