可以使用walrus操作符来避免在列表推导式中调用多个函数吗?



假设我有一个这样的列表

lol = [[1, 'e_r_i'], [2, 't_u_p']]

,我想将一个函数应用到字符串元素,它返回几个值,我只需要其中的一个子集(每个用例不同)。为了说明,我只做了一个简单的split()操作:

def dummy(s):
return s.split('_')

现在,假设我只想要最后两个字母并将它们连接起来;有一个简单的选项

positions = []
for _, s in lol:
stuff = dummy(s)
positions.append(f"{stuff[1]}{stuff[2]}")

和在列表推导式

中做相同的操作
print([f"{dummy(s)[1]}{dummy(s)[2]}" for _, s in lol])

都给出了相同的期望结果

['ri', 'up']

是否有一种方法可以在列表推导中使用海象操作符来避免两次调用dummy?

PS:不用说,实际上dummy函数要复杂得多,所以我不寻找关于split的更好的解决方案,但它完全是关于海象操作符的结构和潜在用途的。

我不得不说第一个显式循环是最好的选择。它是清晰的,可读的代码,你没有重复任何调用。

然而,当你要求的时候,你总是可以这样做:

print([f"{(y:=dummy(s))[1]}{y[2]}" for _, s in lol])

您也可以将处理封装在另一个函数中:

def dummy2(l):
return f"{l[1]}{l[2]}"

这完全消除了对walrus的需要,并进一步简化了代码:

print([dummy2(dummy(s)) for _, s in lol])

是。这是你想要的

output = [f"{(stuff := dummy(s))[1]}{stuff[2]}" for _, s in lol]

相关内容

  • 没有找到相关文章

最新更新