2013-04-26 48 views
4

道歉的真正微不足道的入门级python问题。while循环条件:复合条件表达式AND'd [python]

目前通过谷歌的Python教程工作,碰到了什么东西可能绊倒了我,如果我不打钉下来 - 使用and'd值作为while循环的执行复合条件。

通过它看起来好像while循环运行,而这两个列表的长度都是正数。因此,一旦这两个列表的长度都为0,那么while循环将命中0并终止。

我不确定如何在精神上解析这一点 - 条件是,一旦两个长度== 0,则和声明,是0和0,给人一种消极条件和终止。

读它通过I解析它作为同时“5”和“6”(如果例如5和6是列表的LEN)。到目前为止,我还没有遇到这种方式使用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
while len(list1) and len(list2): 

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

(在布尔上下文,除了False任何值,None0"",或[]将评估为真。)

+0

啊太好了。谢谢 - 所以它是有效的:1和1 = 1,0和1 = 0,0和0 = 0 一旦它达到评估为0的东西,它终止。非常感谢您的时间。 – 2013-04-26 11:49:58

2

上官方Python文档引用Built In Types Page

x and y给根据该结果:if x is false, then x, else y

而且这个页面上应提到的是:

这是一个短路操作,因此,如果第一个是真正的

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

+0

非常感谢。这真的清除了情况/流量。 – 2013-04-26 12:20:23

2

了解这一点的关键是pop声明。

基本上,该函数将两个已排序的列表合并到一个包含两个列表的所有元素的列表中。它是mergesort算法的一部分。此工作原理如下:

  • 只要两个列表包含剩余元素,重复以下循环
    • 从列表中选择的头部较小的元件(即,第一元件)
    • 删除元素从各自的清单,并把它添加到结果列表
    • 重复
  • 然后,名单中至多一个STIL l包含元素。将该列表的其余元素添加到结果中。