2013-04-26 78 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包含元素。將該列表的其餘元素添加到結果中。