我一直在尝试使用列表推导来简化此代码:
-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
答案 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
每一个元素
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))
但循环可能更容易理解和维护......