在Python中,我知道检查列表是否为空的pythonic方法是
if not a:
# do things with empty list
要检查列表是否为空,我们会这样做:
if a:
# do things with my list
如果两个列表不为空,我们如何同时检查(如同读取)?
if a and b:
# do things with my two lists
以上似乎不起作用,我不确定(a and b)
实际上意味着什么。对于a = [2]
,b = [1,3]
,(a and b) = [1,3]
。 and
运算符实际在这里做什么?如果我在某个时候最终减少b = []
,(a and b) = []
即使a
不为空。
编辑:我的用例类似于
while (a and b are not empty):
modify a
modify b
我会天真地认为,由于if a
检查列表是否为空,if a and b
会检查两者是否为空,但事实并非如此。
答案 0 :(得分:7)
它工作正常。对于a = [2]
和b = [1, 3]
,a and b
返回[1, 3]
这是真实的,完全如您所料,因为True and True
是True
。当您将b
更改为[]
时,它会返回[]
,这是假的,再次完全符合您的预期,因为True and False
是False
。所以if a and b
完全符合您的要求。
实际发生的是and
返回决定表达式真值的值。 and
并不总是评估两个子表达式;当第一个是假的时候,整个表达是假的,第二个不需要评估,因此不是。这称为短路。 or
表现相似(如果第一部分是真实的,则跳过评估第二部分)。只要and
或or
能够做出决定,它就会返回该值。
另一种看待它的方式:Python中的bool(a) and bool(a) == bool(a and b)
。
答案 1 :(得分:2)
a and b
是正确的。
and
将返回第二个参数。
答案 2 :(得分:1)
你可以这样做
if len(a) and len(b):
#do something
答案 3 :(得分:0)
我认为你想要的是
>>> a, b = list(), list()
>>> while not (a and b):
... a.append(1)
... b.append(2)
...
>>> a, b
([1], [2])
>>>
答案 4 :(得分:0)
and
运算符比较两个布尔值
bool([]) == False
所以[] and b
总是返回[]
;无论b
是什么。
答案 5 :(得分:0)
要基于kindall的答案-您还可以在进行真实性测试之前将列表连接起来:
a = []
b = []
c = [1]
bool(a + b) # False
bool(a + b + c) # True
如果您在重要的事情上做,这当然会带来性能损失。