2013-05-08 186 views
0

我是一個Python新手。 想象一下,我有一個列表[100, 200, 300, 301, 315, 345, 500]。我想創建一個新的列表,如[100, 200, 300, 500]迭代通過列表與

當我遍歷列表等認爲:i內的while循環不會反映爲內for循環i

for i in range(len(list)): 
    while (list[i+1] - 100) <= list[i]: 
     i = i + 1 
     k = list[i] 

然後變化,所以通過相同的元件迭代多次。

更改代碼以避免這種情況的更好方法是什麼?

回答

5

以下是我會做它

>>> mylist = [100,200,300,301,315,345,500] 
>>> [x for x in mylist if x % 100 == 0] 
[100, 200, 300, 500] 

編輯:在你的算法的仔細檢查,看來你實際上是試圖建立比以前的值越大值的列表加上99在這種情況下,這將工作:

def my_filter(lst): 
    ret = [lst[0]] 
    for i1, i2 in zip(lst, lst[1:]): 
     if i2 - i1 >= 100: 
      ret.append(i2) 
    return ret 

上述算法是這樣的:

>>> my_filter([101, 202, 303, 305, 404, 505]) 
[101, 202, 303, 505] 
1

range(len(list))將查看列表長度一次,然後創建一個範圍迭代器,然後將它與列表及其長度完全分開。

所以for i in range(len(list))將使i0len(list)-1,而不考慮列表的變化。還要注意,更新循環內的迭代器變量i根本不會影響循環本身。當下一次迭代開始時,i只會獲得下一個值,而不管您是否希望在之前遞增i時跳過一個迭代。

要跳過迭代,通常使用continue語句,該語句只會中止當前迭代,並從下一個i開始。

關於你的實際問題,你似乎想要過濾所有數字是100的倍數。你可以檢查一個單一的數字更容易檢查如果你可以除以100沒有任何餘數。爲此,您使用modulo operation,這將爲您提供一個部門的剩餘部分。在你篩選這些列表理解相結合,你可以簡單地把它寫這樣的:

>>> lst = [100, 200, 300, 301, 315, 345, 500] 
>>> [n for n in lst if n % 100 == 0] 
[100, 200, 300, 500] 

還要注意的是,你不應該命名您的變量list爲將覆蓋參考list類型。

+0

謝謝你的回答,但其實我的目的是更復雜一點。該清單只是一個例子。對不起,因爲沒有準備,但我不想過分細節並給出太複雜的描述。我有一些滑動窗口和兩個列表保持每個窗口的開始和結束位置。我想過濾出重疊或相鄰的窗口。當列表中的下一個元素非常接近前一個元素時,我想遍歷列表直到找到足夠遠的元素,只要我找到它,就可以從第二個列表中訪問相應的元素。 – Malfet 2013-05-08 15:20:34

0

這裏是我的解決方案:

def my_filter(xs): 
    ys = [] 
    for x in xs: 
     if (not ys) or ys[-1] + 100 <= x: 
      ys.append(x) 
    return ys 
my_filter([100, 200, 300, 301, 315, 345, 500]) >> [100, 200, 300, 500] 
+0

請注意,該算法在某些輸入上產生與我的結果不同的結果。例如,對於輸入'[100,150,200]',你的函數輸出'[100,200]',而我的產生'[100]''。我不確定OP真正需要的是什麼,因爲他選擇的輸入和輸出都與這些答案中給出的所有三種算法相匹配。 – 2013-05-08 12:19:28

+0

謝謝你的回答。事情是,我需要然後還索引每個元素。所以,在我的例子中,一旦我經歷了301,315,345並找到500,我必須從另一個列表中獲得相應的第六個元素......並且,是的,我確實需要最後一個值。 – Malfet 2013-05-08 15:25:34

+0

@Malfet你可以使用'enumerate'來獲取元素及其索引。 – poke 2013-05-08 15:33:20