我正在从SQLite数据库导入值,并希望在其中一列上运行lambda表达式以创建列表。
cur.execute('SELECT p, T FROM W')
data = cur.fetchall()
lst = list()
for row in data:
p = float(row[0])
T = float(row[1])
lst.append(lambda T: p if T < 1 else 0)
运行此命令时,输出为以下列表:
< function <lambda> at 0x00000255E52AA8C8> .
我想在p
<1时将列表附加T
的值,如果T
> 1则添加0。
答案 0 :(得分:5)
完全不需要lambda
:
lst.append(p if T < 1 else 0)
三元表达式本身将起作用。为了获得lambda函数的返回值,必须调用它,类似以下几行:
lst.append((lambda: p if T < 1 else 0)())
这当然是毫无意义的。 Lambda函数只能包含一个表达式。立即返回到裸表达式,立即调用它会使函数过时。这就是为什么此类函数通常采用由函数所传递的上下文动态填充的参数的原因。该lambda甚至不需要参数,因为所有必需的部分都已准备就绪,可以使用。
答案 1 :(得分:2)
另一种解决方案是考虑列表理解以创建最终列表lst
。这样,您还可以避免使用中间变量。当然,这只是解决您的问题的一个班轮。
lst = [float(row[0]) if float(row[1]) < 1 else 0 for row in data]
答案 2 :(得分:1)
您已经得到2个很好的答案,所以我将建议另一种方法。假设您实际上只是按照显示的逻辑选择了这两列,就可以在查询级别解决此问题。
如果表中有很多行,这可能会提高性能:
cur.execute('SELECT CASE WHEN T < 1 THEN p WHEN T > 1 THEN 0 END FROM W')
data = cur.fetchall()
那么您就不需要循环了,因为data
已经包含了所需的内容。请记住,对于其中None
的行,此查询将返回T == 1
,但是可以容易地用另一个WHEN
处理。
答案 3 :(得分:0)
您不需要lambda表达式。
您可以这样想:当前,您正在告诉计算机将函数本身附加到列表中;您并不是在告诉计算机附加该值的评估值。如果您摆脱了lambda T:
位,那么基本上就是在做一个内联的if语句,该语句可以对值进行评估。 Lambda函数用于定义稍后要使用的单行函数。