Python中如何用简洁写法替代数组/DataFrame的None判断赋值逻辑?
这个问题太常见了!想用简洁的写法替代if a is None的判断,但又踩了numpy数组或pandas DataFrame的真值判断坑对吧?我给你几个靠谱的方案,分两种情况来说:
情况1:和原始逻辑完全一致(仅当a为None时用b)
如果你的需求还是和原来的代码一样——只有当a明确是None的时候才替换成b,不管a是空数组、0还是其他假值,那最安全简洁的写法就是:
import numpy as np b = np.array([1,2,3,4]) def func(a=None): a = b if a is None else a
这个写法完全等价于你原来的if判断,而且根本不会触发数组的真值判断,因为只检查a is None,对任何类型都友好,包括数组、DataFrame、浮点数啥的。
情况2:想实现「a为None或零长度时用b」(利用非零长度为True的特性)
如果你确实想利用“非零长度的数组/列表视为True”的特性——也就是当a是None,或者a是零长度的空数组/列表/DataFrame时,才替换成b,那可以这样写:
import numpy as np b = np.array([1,2,3,4]) def func(a=None): a = a if (a is not None and len(a)) else b
这个写法会先判断a不是None,再检查它的长度是否非零,只要满足就保留a,否则用b。对于numpy数组和pandas DataFrame,len()都能正常返回元素个数(数组是维度长度,DataFrame是行数),不会触发真值判断的错误。
要是担心某些特殊类型的len()表现不够准确,也可以用更通用的方式检查元素总数:
import numpy as np b = np.array([1,2,3,4]) def func(a=None): a = a if (a is not None and np.asarray(a).size) else b
np.asarray(a).size会返回所有元素的总数,不管是一维数组、多维数组还是DataFrame,都能准确判断是否为空。
最后提一句:a = a or b之所以报错,是因为numpy数组和pandas DataFrame不允许直接做真值判断(毕竟歧义性太大——到底是所有元素为True才算True?还是只要有一个?),所以我们绕开直接判断真值,改用明确的is None或者长度/元素数量检查,就能完美解决问题啦!
内容的提问来源于stack exchange,提问作者Marses

