可以使用海象运算符来避免列表理解中的多个函数调用吗?
Can the walrus operator be used to avoid multiple function calls within a list comprehension?
假设我有一个这样的列表列表
lol = [[1, 'e_r_i'], [2, 't_u_p']]
并且我想将一个函数应用于 returns 几个值的字符串元素,我只需要其中的一个子集(每个用例不同)。为了便于说明,我只做了一个简单的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
的更好的解决方案,但它完全关于海象运算符的结构和潜在用途。
是的。这就是你想要的
output = [f"{(stuff := dummy(s))[1]}{stuff[2]}" for _, s in lol]
我不得不说,您的第一个显式循环是这里的最佳选择。它是清晰易读的代码,您不会重复任何调用。
不过,正如您所要求的,您始终可以这样做:
print([f"{(y:=dummy(s))[1]}{y[2]}" for _, s in lol])
您也可以将处理包装在另一个函数中:
def dummy2(l):
return f"{l[1]}{l[2]}"
这完全消除了海象的需要并进一步简化了代码:
print([dummy2(dummy(s)) for _, s in lol])
假设我有一个这样的列表列表
lol = [[1, 'e_r_i'], [2, 't_u_p']]
并且我想将一个函数应用于 returns 几个值的字符串元素,我只需要其中的一个子集(每个用例不同)。为了便于说明,我只做了一个简单的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
的更好的解决方案,但它完全关于海象运算符的结构和潜在用途。
是的。这就是你想要的
output = [f"{(stuff := dummy(s))[1]}{stuff[2]}" for _, s in lol]
我不得不说,您的第一个显式循环是这里的最佳选择。它是清晰易读的代码,您不会重复任何调用。
不过,正如您所要求的,您始终可以这样做:
print([f"{(y:=dummy(s))[1]}{y[2]}" for _, s in lol])
您也可以将处理包装在另一个函数中:
def dummy2(l):
return f"{l[1]}{l[2]}"
这完全消除了海象的需要并进一步简化了代码:
print([dummy2(dummy(s)) for _, s in lol])