【问题标题】:Using list comprehension to print converted string?使用列表推导打印转换后的字符串?
【发布时间】:2018-04-25 22:57:14
【问题描述】:

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

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 和 if 混淆,但如何打印字符串?

[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

【问题讨论】:

  • 列表理解中的if 子句位于for 子句之后。
  • 谢谢!它有效,但我需要打印新字符串。这似乎不起作用:[print(str(re.sub(conv_regx, r'\3 \2 \4 \5', str(i)))) for i in list(cnn) if "Conv2d" in str(i) ]
  • 也没有必要将re.sub() 结果转换为str() - 它已经是一个字符串了。
  • 如果您实际上并不关心收集列表中的所有字符串,则使用列表推导式没有多大意义。只需在原始代码中使用for 循环即可。

标签: python list-comprehension


【解决方案1】:

使用列表推导式并不总是一个好主意,但它总是 创建一个很好的练习。让我们检查您的代码。你有一个循环 应该输出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))

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

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2016-09-29
    相关资源
    最近更新 更多