我一直在尝试将这两个 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]
最直接的方法是将完成的工作放在函数内的内循环中:
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
]
太可怕了。
请注意,与往常一样,当使用列表理解来消除副作用时,这不必要地构建一个列表,在这种情况下,只是为了从中提取最后一项。