Python:如何检查两个列表不为空

7
在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 和 b)到底是什么意思。如果 a = [2],b = [1, 3],那么(a and b)= [1, 3]。这里的 and 运算符实际上是在做什么呢?如果我最终把 b = [],即使 a 不为空,(a and b) = []。
编辑:我的使用情况如下:
while (a and b are not empty):
    modify a
    modify b

我曾天真地认为,因为if a检查列表是否为空,if a and b会检查两个列表都不为空,但事实并非如此。

2
可能是一个重复的问题:在and操作符中发现混淆 - vaultah
当您说“不工作”时,您的意思是什么? - Wyrmwood
我理解有困难,“if a and b:”只有当两个变量都不为空时才会为True。 - Padraic Cunningham
我会编辑问题并检查重复内容。这个问题很难搜索,因为“and”通常不被索引。 - drglove
if a and b 检查两个列表是否都为空。如果你看到的情况似乎不是这样,那么问题可能出在你的循环中,而不是条件语句中。 - Peter DeGlopper
当你说 while (a and b are not empty): 时,你是指 "当 a 不为空且 b 不为空时",还是 "至少有一个列表不为空时"? 例如,第一个条件将在 a==[1,2,3] 和 b==[] 时停止循环,但第二个条件将继续执行。 - Kevin
6个回答

9
它表现得很好。对于 `a = [2]` 和 `b = [1, 3]`,`a and b` 返回 `[1, 3]`,这是真实的,正如您所期望的那样,因为 `True and True` 是 `True`。当你将 `b` 更改为 `[]` 时,它返回 `[]`,这是虚假的,再次正如你所期望的那样,因为 `True and False` 是 `False`。所以 `if a and b` 正是你想要的。
实际发生的是,`and` 返回决定表达式真假的值。当第一个表达式为虚假时,整个表达式为虚假,第二个表达式不需要被计算,也就不被计算。这被称为短路运算。`or` 表现类似(如果第一部分为真,跳过计算第二部分)。无论 `and` 还是 `or` 能够作出决策,它都返回该值。
另一种看待它的方式:在Python中,`bool(a) and bool(b) == bool(a and b)`。

谢谢您的解释,很有道理。除了检查它们的长度之外,是否有更好的方法来检查这两个变量是否不为空? - drglove
2
是的,就像你最初写的那样,如果a和b都成立。 - kindall

2

a 和 b 是正确的。

and 如果第一个参数为真,则返回第二个参数。


第二个注释,当为真时,只有在if之外才有意义(像赋值一样)。 - Wyrmwood

1

你可以做到这个

if len(a) and len(b):
    #do something

我考虑过这个问题,但是想知道是否有更接近 a and b 的东西。如果没有,我会接受它,但我仍然想知道这个运算符在这里实际上是做什么的。 - drglove
你能举一个示例,说明在哪种情况下这个操作与 if a and b: 的行为不同吗? - Kevin
@Kevin,是否会出现这种情况? - ForceBru
1
@PeterDeGlopper 这个能够工作是因为 if a and b 能够工作。这与 if a and b 完全相同,只是更长而已。 - vaultah
@ForceBru,如果没有这种情况,那么为什么要使用它而不是 if a and b: - Kevin
没有理由使用这个。 - Peter DeGlopper

1

我想你想要的是

>>> a, b = list(), list()
>>> while not (a and b):
...    a.append(1)
...    b.append(2)
...
>>> a, b
([1], [2])
>>>

0

and 运算符用于比较两个布尔值。

    bool([]) == False

[]b总是返回[],无论b是什么。


0
构建在kindall的答案上 - 在进行真值测试之前,您还可以连接列表:
a = []
b = []
c = [1]
bool(a + b)  # False
bool(a + b + c)  # True

当然,如果您正在进行那些性能很重要的操作,这可能会带来性能损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接