2013-10-09 37 views
0
park = "a park.shp" 
road = "the roads.shp" 
school = "a school.shp" 
train = "the train" 
bus = "the bus.shp" 
mall = "a mall" 
ferry = "the ferry" 
viaduct = "a viaduct" 

dataList = [park, road, school, train, bus, mall, ferry, viaduct] 

print dataList 

for a in dataList: 
    print a 
    #if a.endswith(".shp"): 
    # dataList.remove(a) 

print dataList 

給出了下面的輸出(所以循環工作,正確地閱讀一切):的Python(2.6.6)的endsWith()在for循環

['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct'] 
a park.shp 
the roads.shp 
a school.shp 
the train 
the bus.shp 
a mall 
the ferry 
a viaduct 
['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct'] 

但是當我刪除#標記運行if語句,它應該刪除以.shp結尾的字符串,字符串道路仍然在列表中?

['a park.shp', 'the roads.shp', 'a school.shp', 'the train', 'the bus.shp', 'a mall', 'the ferry', 'a viaduct'] 
a park.shp 
a school.shp 
the bus.shp 
the ferry 
a viaduct 
['the roads.shp', 'the train', 'a mall', 'the ferry', 'a viaduct'] 

我注意到的其他東西,它不打印所有的字符串,當它清楚地在for循環,應該通過每個字符串?有人可以請解釋發生了什麼問題,循環保持字符串路線,但發現其他字符串以.shp結尾並正確刪除它們?

感謝, C(因爲弧10.0僅供參考,這是關於Python 2.6.6)

+0

你不應該永遠變異的對象(如表),而你遍歷它。壞事發生。通常,在學習使用列表解析過濾之後,根本不需要使用「remove」。 – roippi

+0

[Loop「忘記」刪除某些項目的可能的重複](http://stackoverflow.com/questions/17299581/loop-forgets-to-remove-some-items) –

回答

0

您正在改變列表並導致索引跳過。

使用列表理解是這樣的:

[d for d in dataList if not d.endswith('.shp')] 

,然後得到:

>>> ['the train', 'a mall', 'the ferry', 'a viaduct'] 
+0

感謝所有三個答案,兩個使用列表理解,一個簡單地創建一個新列表。嘗試了兩種解決方案,他們工作得很好,歡呼! – user2864884

0

從你遍歷幾乎都是相同的列表中刪除的項目會引起問題。製作原始列表的副本並反覆進行,這樣你就不會跳過任何東西。

for a in dataList[:]: # Iterate over a copy of the list 
    print a 
    if a.endswith(".shp"): 
     dataList.remove(a) # Remove items from the original, not the copy 

當然,如果這個循環沒有比創建一個沒有.shp文件列表其他目的,你可以使用一個list comprehension並跳過全亂了。

no_shp_files = [a for a in datalist if not a.endswith('.shp')] 
+0

感謝所有三個答案,兩個使用列表理解和一個​​簡單地創造一個新的名單。嘗試了兩種解決方案,他們工作得很好,歡呼! – user2864884