将双 for 循环总结为列表理解

问题描述 投票:0回答:1

我一直在尝试将这两个 for 循环转换为列表理解:

with open(sourceFile, 'r+t') as file:
        for line in file:
            for key, value in patterns.items():
                line = re.compile(value, flags=re.IGNORECASE).sub(key, line)
            targetList.append(line)

我希望得到这样的结果:

return [[re.compile(value, flags=re.IGNORECASE).sub(key, line) for key, value in patterns.items()] for line in file]
python list dictionary file python-re
1个回答
0
投票

最直接的方法是将完成的工作放在函数内的内循环中:

def transform(line):
    for key, value in patterns.items():
        line = re.compile(value, flags=re.IGNORECASE).sub(key, line)
    return line

result = [transform(line) for line in file]

如果您希望所有内容都在一个独立的 for 循环中……那么,您真的不应该这样做。再次,完成内部循环以消除副作用。列表推导式用于表达映射/过滤操作。不是为了副作用。现在,可以将列表推导与累加器变量一起使用,就像您在内部循环中使用赋值表达式所做的那样。但它们有目的地限制了它们发生的地点(正是为了将这些恶作剧消灭在萌芽状态)。这使得将其变成纯粹的列表理解真的很难看(无论如何它都会很难看)!这是一种方法:

result = [
    ((acc:=line) and [(acc:=re.compile(value, flags=re.IGNORECASE).sub(key, line)) for  key, value in patterns.items()])[-1] if line else '' 
    for line in lines
]

太可怕了。

请注意,与往常一样,当使用列表理解来消除副作用时,这不必要地构建一个列表,在这种情况下,只是为了从中提取最后一项。

© www.soinside.com 2019 - 2024. All rights reserved.