4

为真正微不足道的入门级 python 问题道歉。

目前正在通过谷歌 Python 教程工作,如果我没有确定它可能会绊倒我 - 使用 and'd 值作为执行 while 循环的复合条件。

通读它看起来好像 while 循环在运行,而两个列表的长度都是正数。因此,一旦两个列表的长度 == 0,while 循环就会达到 0 并终止。

我不确定如何在心理上解析这个 - 条件是否是一旦两个长度 == 0 然后 and 语句和 0 和 0,给出否定条件并终止。

通过阅读它,我将其解析为 while '5' 和 '6' (例如,如果 5 和 6 是列表的长度)。到目前为止,我还没有遇到过以这种方式使用 while 循环的情况(只使用了一天左右)。

我不明白的代码位(抽象行)

while len(list1) and len(list2):

上下文中的代码

def linear_merge(list1, list2):

  result = []     
  while len(list1) and len(list2):
    if list1[0] < list2[0]:
      result.append(list1.pop(0))
    else:
      result.append(list2.pop(0))    

  result.extend(list1)
  result.extend(list2)
  return result

非常感谢。

4

3 回答 3

4
while len(list1) and len(list2):

当list1和list2都不为空时会继续循环;如果任一列表为空,则循环将终止。

(在布尔上下文中,除FalseNone0""或之外的任何值都[]将评估为真。)

于 2013-04-26T11:14:48.247 回答
2

在官方 Python 文档中引用内置类型页面:

x and y 根据以下给出结果: if x is false, then x, else y

在此页面上进一步提到:

这是一个短路运算符,因此它仅在第一个参数为 True 时才计算第二个参数

所以在你的问题中,它首先评估 len(list1)。如果它是肯定的,第一个条件为真,然后它评估第二个条件。如果这也是 True(即 len(list2)>=1),则它进入循环。虽然从根本上说它是一个AND操作,但它的不同之处在于我们不需要评估第二个条件,如果第一个条件为 False。在某些情况下,当第二个条件可能涉及耗时的计算时,这可能非常有用。

于 2013-04-26T11:49:09.267 回答
2

理解这一点的关键是pop语句。

基本上,该函数将两个已经排序的列表合并为一个列表,其中包含两个列表的所有元素。它是归并排序算法的一部分。这工作如下:

  • 只要两个列表都包含剩余元素,重复以下循环
    • 从列表的头部选择较小的元素(即第一个元素)
    • 从相应列表中删除元素并将其添加到结果列表中
    • 重复
  • 然后,至多一个列表仍然包含元素。将该列表的其余元素添加到结果中。
于 2013-04-26T11:52:09.577 回答