如何解决是否可以使用 walrus 运算符来避免列表推导式中的多个函数调用?
假设我有一个这样的列表
Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.bottles.Fragment1.onClick(Fragment1.java:36)
并且我想将一个函数应用于字符串元素,该函数返回几个值,我只需要其中的一个子集(每个用例都不同)。出于说明目的,我只是做了一个简单的 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']
两次?
PS:不用说,实际上 dummy
函数要复杂得多,所以我没有寻找关于 dummy
的更好解决方案,但它完全与结构和潜在用法有关海象操作员。
解决方法
我不得不说,您的第一个显式循环是这里的最佳选择。代码清晰易读,无需重复任何调用。
不过,正如您所要求的,您始终可以这样做:
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])
,
是的。这就是你想要的
output = [f"{(stuff := dummy(s))[1]}{stuff[2]}" for _,s in lol]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。